@ OneToOne проблема аннотации (я думаю ...) - PullRequest
1 голос
/ 02 июня 2010

я новичок в спящем режиме и JPA, и у меня есть некоторые проблемы с аннотациями.

Моя цель - создать эту таблицу в дБ (PERSON_TABLE с личными данными)

ID      ADDRESS     NAME    SURNAME     MUNICIPALITY_ID

Во-первых, у меня есть таблица МУНИЦИПАЛИТЕТ в дБ, содержащая весь муниципалитет моей страны. Я сопоставил эту таблицу в этом объекте:

@Entity
public class Municipality implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String country;
private String province;
private String name;
@Column(name="cod_catasto")
private String codCatastale;
private String cap;


public Municipality() {
}

...

Затем я создаю адрес класса EMBEDDABLE, содержащий поля, которые реализуют простой адрес ...

@Embeddable
public class Address implements Serializable {

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="id_municipality")
private Municipality municipality;
@Column(length=45)
private String address;

public Address() {
}

...

Наконец-то я встроил этот класс в Person ENTITY

@Entity
public class Person implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private String surname;
@Embedded
private Address address;

public Person() {
}

...

Все работает хорошо, когда мне нужно сохранить новую запись Person, фактически hibernate создает PERSON_TABLE, как я хочу, но если я пытаюсь получить запись Person, у меня есть исключение. HQL это просто "от человека" Исключением является (Entities - это пакет, содержащий все вышеперечисленные классы):

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on Entities.Person.address.municipality references an unknown entity: Entities.Municipality

Является ли аннотация @OneToOne проблемой?

Мой hibernate.cfg.xml такой:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:tcp://localhost/DB_PATH</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping class="Entities.Person"/>
        <mapping class="Entities.Municipality"/>
        <mapping class="Entities.Address"/>
    </session-factory>
</hibernate-configuration>

Спасибо.

Ответы [ 4 ]

3 голосов
/ 02 июня 2010

Проблема в том, что ... я отправляю запросы в netbeans на вкладку "HQL Query ()", я пытаюсь создать запрос

session.createQuery("from Person");

и все работает хорошо.

Извините, ребята, моя вина, я сначала делаю этот тест ... я подумал, что HQL Wizard в NetBeans был надежным инструментом для тестирования запросов ...

В таком случае, какой ответ я должен выбрать? Все разумны и полны советов!

Снова извините.

2 голосов
/ 02 июня 2010

Полагаю, ваша ошибка только потому, что вы определили класс @Embeddable (Address) как Entity. @Embeddable class не является простым объектом, поэтому удалите его из файла hibernate.cfg.xml

<mapping class="Entities.Person"/>
<mapping class="Entities.Municipality"/>
1 голос
/ 02 июня 2010

Вы чертовски уверены, что используете @javax.persistence.Entity вместо @org.hibernate.annotations.Entity?

Хорошо, еще одно предположение. Не могли бы вы попробовать изменить @OneToOne на @OneToOne(targetEntity = Municipality.class)?

1 голос
/ 02 июня 2010

Нет. Проблема в том, что Hibernate не распознает Municipality как сущность. Правильно ли он настроен (например, в вашем файле persistence.xml)?

Редактировать: Сообщение об ошибке странно для этой ситуации, и я не знаю, действительно ли это проблема, но Address.municipality следует определить как @ManyToOne (так как будет несколько адреса, ссылающиеся на один и тот же муниципалитет).

...