使用已创建的子项保存父项后的TransientPropertyValueException

时间:2014-07-17 07:57:39

标签: java spring hibernate java-ee

我们说我有这种休眠关系。

 class A{
   @OneToOne(orphanRemoval = true, cascade = {CascadeType.ALL})
   @JoinColumn(name = "b_id", nullable = false)
   @Getter
   @Setter
   @XmlElement
   private B b;
}

还有这个

class B{  
   @OneToOne
   @JoinColumn(name = "a_id")
   @Getter @Setter
   @XmlTransient
   private A a;

  }

在某些方面我想保存我的A类,这是第一次在数据库上还没有,“但是”B已经存在,因为之前保存在另一个事务中而不是On Cascade by A,所以与之关系B表上的A仍为空。现在使用此当前配置我收到此异常。

      org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

那么,A我需要做什么配置才能坚持A,并把B与A的关系放在一起?

的问候。

1 个答案:

答案 0 :(得分:0)

首先,您将关联映射两次。如果B是所有者方,则需要使用mappedBy标记另一端:

class A{
   @OneToOne(mappedBy="a", orphanRemoval = true, cascade = {CascadeType.ALL})   
   @Getter
   @Setter
   @XmlElement
   private B b;
}

然后这是一步一步的操作顺序:

  1. 您需要先获取B

    B b session.get(B.class, 1L);
    
  2. 您创建了A

    A a = new A();
    
  3. 您设置了关联的两面

    a.b = b;
    b.a = a;
    
  4. 你坚持

    session.persist(a);