1

我是 hibernate 和 JPA 的新手,我在注释方面遇到了一些问题。

我的目标是在数据库中创建这个表(带有个人详细信息的PERSON_TABLE)

ID      ADDRESS     NAME    SURNAME     MUNICIPALITY_ID

首先,我在 db 中有一个 MUNICIPALITY 表,其中包含我国家的所有自治市。我在这个实体中映射了这个表:

@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 只是“来自 Person”的 excpetion 是(实体是包含上述所有类的包):

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

4 回答 4

3

问题是......我将我的查询午餐到netbeans“HQL Query()”选项卡中,我尝试创建一个查询

session.createQuery("from Person");

一切都很好。

对不起,我的错,我先做这个测试......我认为netbeans的HQL向导是测试查询的可靠工具......

在这种情况下,我必须选择哪个答案?一切都是合理的,充满了提示!

再次抱歉。

于 2010-06-02T12:25:35.470 回答
2

我想您的错误只是因为您将@Embeddable 类(地址)定义为实体。@Embeddable 类不是普通实体,因此请从 hibernate.cfg.xml 文件中删除它

<mapping class="Entities.Person"/>
<mapping class="Entities.Municipality"/>
于 2010-06-02T11:10:40.210 回答
1

你确定你用@javax.persistence.Entity的是代替@org.hibernate.annotations.Entity吗?

好吧,另一个猜测。你可以尝试改变@OneToOneto@OneToOne(targetEntity = Municipality.class)吗?

于 2010-06-02T12:07:15.167 回答
1

不,问题在于 Hibernate 无法识别Municipality为实体。是否正确配置(例如在您的 persistence.xml 中)?

编辑:这种情况下的错误消息很奇怪,我不知道这是否真的是问题,但Address.municipality应该定义为@ManyToOne(因为会有多个地址引用同一个城市)。

于 2010-06-02T10:01:53.883 回答