Hibernate 从带有@OneToOne注释的表中删除
我正在使用JPA2和Hibernate实现 我有这样的简单映射:Hibernate 从带有@OneToOne注释的表中删除,hibernate,jpa-2.0,cascade,one-to-one,Hibernate,Jpa 2.0,Cascade,One To One,我正在使用JPA2和Hibernate实现 我有这样的简单映射: @Entity class Topic { @Id @GeneratedValue(strategy = IDENTITY) int id; @OneToOne(cascade = ALL) @JoinColumn(name = "id_poll") private Poll poll; } @Entity class Poll { @Id @Generate
@Entity
class Topic {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
@OneToOne(cascade = ALL)
@JoinColumn(name = "id_poll")
private Poll poll;
}
@Entity
class Poll {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
}
现在,当我删除主题中的轮询对象时,我得到一个错误
java.sql.SQLException:完整性约束冲突FKCC42D924982D3F4B表:语句中的主题[从轮询中删除,其中id=?]
我理解这是因为如果投票记录在另一个表中有引用,我无法删除它。我怎样才能解决这个问题?我必须在主题表中手动设置poll=null还是有更好的解决方案?看起来JPA 2中的@OneToOne注释包含一个孤立删除标志,您可以尝试设置该标志,看看它是否优雅地删除了它。我现在无法找到解决方案,所以在我删除一个Poll对象之前,我总是得到一个包含给定池的Topic对象,并将其设置为null
Topic topic = entityManager.find( Topic.class, 1 );
Poll poll = topic.getPoll();
topic.setPoll( null );
entityManager.remove( poll );
它工作正常。问题在于,您在两侧都使用了自动生成的ID。当您持久化父实体时,子实体也会持久化,但父实体中的ID不会更新为从数据库生成的ID 因此,删除父项时,不会删除子项,因为子项没有ID
尝试手动设置子实体的ID,删除将起作用。这是预期的行为: 双向关系的一个常见问题是应用程序 更新关系的一方,但另一方不获取 已更新,并变得不同步。在JPA中,就像在Java中一样,是 应用程序或要维护的对象模型的责任 关系 资料来源: 处理此问题的正确位置是@PreRemove回调:
@Entity
class Poll {
...
@PreRemove
private void preRemove() {
Poll poll = topic.getPoll();
topic.setPoll( null );
}
}
另见: