我在数据库A和B中有两个表。表B有一个由两个字段组成的id。其中一个是A的外键.A的ID在插入时由序列自动生成。
A:
ID (PK)
(*other fields*)
B:
SOME_FIELD (PK)
A_ID (PK, FK to A)
我已经在JPA specification之后映射了JPA(Hibernate)中的两个表,这样:
@Entity
@Table(name = "A")
public class A implements Serializable {
@Id
@SequenceGenerator(name = "A_SEQ", sequenceName = "A_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "A_SEQ")
@Column(name = "ID")
private Long id;
(...)
}
@Entity
@Table(name = "B")
public class B implements Serializable {
@EmbeddedId
@AttributeOverride(name = "someField", column = @Column(name = SOME_FIELD))
private BPK pk;
@MapsId("aId")
@ManyToOne
@JoinColumn(name = "A_ID")
private A a;
(...)
}
@Embeddable
public class BPK implements Serializable {
private Long aId;
private String someField;
@Override
public boolean equals(Object o) {
(...)
}
@Override
public boolean hashCode() {
(...)
}
(...)
}
问题在于,当我尝试保存调用entityManager.persist(b)的B对象时,其中b.a设置为A对象,该对象已存在于数据库中,我得到一个异常:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: package.name.A
我不知道为什么会这样。我正在尝试保存B类的对象,而不是A.我的实体类是错的吗?或者也许我不应该坚持使用?
答案 0 :(得分:3)
可能是实体A不再被实体经理持有。你有没有尝试用一个“新鲜”的A?
实例设置B.a.b.setA(get(b.a));
entityManager.persist(b);
get(b.a)
方法可以是您通常用于从数据源中查找实体A的任何方法,例如entityManager.getReference(A.class, a.id);