【问题标题】:TransientPropertyValueException after saving parent with an created childTransientPropertyValueException 在保存父级和创建的子级后
【发布时间】:2014-07-17 07:57:38
【问题描述】:

假设我有这种休眠关系。

 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 已经存在,因为之前保存在另一个事务中但不是由 A 级联,所以与B 表上的 A 仍然为空。现在有了这个当前配置,我收到了这个异常。

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

那么,我需要在 A 上做哪些配置才能持久化 A,并将与 A 的关系放入 B?

问候。

【问题讨论】:

  • 对于OneToOne 双向映射,@JoinColumn 应仅包含在所有者端。

标签: java spring hibernate jakarta-ee


【解决方案1】:

首先,您映射了您的关联两次。如果 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 = new A();
    
  3. 你设置了关联的两边

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

    session.persist(a);
    

【讨论】:

  • 是我在做什么,什么都没有,同样的错误。我只尝试使用 MERGE 和 DELETE 级联类型,但仍然出现错误
  • 我看到您没有将 mappedBy 用于其中一个关联。检查我的更新回复。
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多