Java 使用基本一对多映射获取错误

Java 使用基本一对多映射获取错误,java,hibernate,Java,Hibernate,我通过遵循hibernate文档创建了一个简单的示例 我已经创建了个人实体和地址实体,如下所示: Person.java public class Person { private int id; private Set<Address> addresses = new HashSet<Address>(); // Setters & Getters public void addAddress(Address address)

我通过遵循hibernate文档创建了一个简单的示例

我已经创建了
个人
实体和
地址
实体,如下所示:

Person.java

public class Person {
    private int id;
    private Set<Address> addresses = new HashSet<Address>();
    // Setters & Getters


    public void addAddress(Address address) {
        this.addresses.add(address);
    }
}
public class Address {
    private int id;
    // Setters & Getters
}
映射文件:

<hibernate-mapping>
    <class name="Person">
        <id name="id" column="personId">
            <generator class="native" />
        </id>
        <set name="addresses">
            <key column="personId" not-null="true" />
            <one-to-many class="Address" />
        </set>
    </class>

    <class name="Address">
        <id name="id" column="addressId">
            <generator class="native" />
        </id>
    </class>
</hibernate-mapping>
执行此程序会给出一个异常,因为:
notnull属性引用一个null或暂时值:Address.\u Person.addressesBackref

完整堆栈跟踪:

org.hibernate.PropertyValueException: not-null property references a null or transient value : Address._Person.addressesBackref
    at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:106)
    at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:132)
    at org.hibernate.action.internal.AbstractEntityInsertAction.makeEntityManaged(AbstractEntityInsertAction.java:141)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:201)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:179)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:166)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:332)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)

您能帮我解决这个问题吗。

例外情况清楚地解释了您添加到
个人的
地址。地址
为空或暂时(未保存)。在将地址添加到Person.addresses之前,您可以尝试保存地址

您需要提交事务。请尝试以下代码

 Session session = getSession();
 Transaction tx;
 try {
     tx = session.beginTransaction();
     //do some work
     Person p = new Person();
     Address a = new Address();

     session.save(a);
     p.addAddress(a);

     session.save(p);
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     session.close();
 }

在数据库级别,您的
地址
表有一个外键,名为
personId
,带有
Person
表。另外,根据hibernate映射文件,外键具有
notnull
约束

根据您的代码,您首先尝试保存
地址
实体(进入
地址
表),然后保存
人员
实体。因此,当hiberate试图保存
地址
实体时,它必须插入列
personId
,因为它有
非空
约束,因为
Person
表中没有记录,所以hibernate将异常作为
地址抛出

因此,要解决这个问题:

解决方案1:

首先保存
人员
,然后尝试像这样保存
地址
实体:

Person p = new Person();
Address a = new Address();

p.addAddress(a);

session.save(p);
session.save(a);
解决方案2


只需删除外键上的
not null
约束-
personId

这里清楚地表明您正在为声明为not null属性的属性设置null值


您正在直接设置没有任何值的对象。因此person id设置为null。但您将其配置为not null。请检查一次。

此外,异常情况不同,显示的是
地址。_person.addressesBackref
,不清楚
地址BackRef
来自何处。
Person p = new Person();
Address a = new Address();

p.addAddress(a);

session.save(p);
session.save(a);