Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 从带有@OneToOne注释的表中删除_Hibernate_Jpa 2.0_Cascade_One To One - Fatal编程技术网

Hibernate 从带有@OneToOne注释的表中删除

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

我正在使用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;
}
现在,当我删除主题中的轮询对象时,我得到一个错误

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 );
    }
}
另见: