java Hibernate持久映射
我有3个表A
、B
和映射表A_B
,其中包含(A_ID
和B_ID
)的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吗
# 1 楼答案
你为什么不试着设定a而不是b呢
您还可以在中清空集合,这样它就不会试图持久化它
编辑:正如评论中所说,它不会产生预期的效果。您应该使用
saveOrUpdate()
而不是persist()
中建议的org.hibernate.PersistentObjectException: detached entity passed to persist