【问题标题】:Hibernate persist mappingHibernate 持久映射
【发布时间】:2015-08-11 08:04:01
【问题描述】:

我有 3 个表 AB 和映射表 A_B,其中包含两者的 ID(A_IDB_ID)。以下是映射这 3 个表的 java 类的样子:

@Entity
@Table(name = "A")
public class A {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name = "FK_A", referencedColumnName="Id", nullable = false)
    private Set<A_B> ab;

    //Other attributes, Getters Setters etc.
}

@Entity
@Table(name = "A_B")
public class A_B {

     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     @Column(name = "ID")
     private Long id;

     @ManyToOne(cascade=CascadeType.ALL)
     @JoinColumn(name = "FK_B", nullable = false)
     private B b;

     //Other attributes, Getters Setters etc.
 }

Entity
@Table(name = "B")
public class B  {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "ID")
    private Long id;

    //Other attributes, Getters Setters etc.
}

现在假设我已经持久化了 B (b) 的一个对象。现在我想保留一个 A (a) 的对象以及这两者 (ab) 之间的关联。我有我的代码:

@PersistenceContext(unitName = "demoPU")
private EntityManager em;

B b = em.createNamedQuery(queryName, B); // Getting obj of B
A a = new A();
A_B ab = new A_B();
ab.setB(b); // Setting B in relationship
a.setAb(ab);

em.persist(a);

但是这试图再次保持 b 并且由于它的 id 已经设置,所以它抛出异常:

org.hibernate.PersistentObjectException: detached entity passed to persist

你能告诉我如何在这种情况下保持关联而不必再次保持 B 吗?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    你为什么不尝试只设置 a 而不是 b ?

    您也可以清空 a 中的集合,这样它就不会尝试持久化它。

    编辑:正如 cmets 中所说,它不会产生预期的效果。您应该使用saveOrUpdate() 而不是persist(),正如org.hibernate.PersistentObjectException: detached entity passed to persist 中所建议的那样

    【讨论】:

    • 只持久化a而不设置ab不会持久化ab之间的关系。
    猜你喜欢
    • 2013-11-15
    • 2013-10-18
    • 2020-06-22
    • 2023-04-04
    • 2018-04-30
    • 2013-04-17
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多