使用@OneToOne注释从表中删除

Daw*_*wid 5 hibernate cascade one-to-one jpa-2.0

我正在使用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
    @GeneratedValue(strategy = IDENTITY)
    int id;
}
Run Code Online (Sandbox Code Playgroud)

现在,当我删除一个也在Topic中的Poll对象时,我收到一个错误.

java.sql.SQLException:完整性约束违规FKCC42D924982D3F4B表:语句中的TOPICS [从民意调查中删除id =?]

我理解这是因为如果Poll记录在另一个表中有引用,我就无法删除它.我怎么解决这个问题?我是否必须在主题表中手动设置poll = null或者是否有更好的解决方案?

Tom*_*asz 6

这是预期的行为:

双向关系的一个常见问题是应用程序更新了关系的一方,但另一方没有更新,并且变得不同步.在JPA中,与Java一样,应用程序或对象模型负责维护关系.

来源:对象损坏,更新另一方后关系的一方未更新

处理此问题的正确位置是@PreRemove回调:

@Entity 
class Poll {

    ...

    @PreRemove
    private void preRemove() {
        Poll poll = topic.getPoll();
        topic.setPoll( null );
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅:让JPA/Hibernate复制"ON DELETE SET NULL"功能