Java 孤立删除=真正的双向OneToOne

Java 孤立删除=真正的双向OneToOne,java,hibernate,jpa,Java,Hibernate,Jpa,我对双向的一对一关系和孤儿的转移有点困惑。这些是我的实体: @Entity @Table(name = "city") public class City { @Id @GeneratedValue @Column public Long _UID; @OneToOne(mappedBy="city", orphanRemoval = true, cascade=CascadeType.ALL) public Mayor mayor; } @

我对双向的一对一关系和孤儿的转移有点困惑。这些是我的实体:

@Entity
@Table(name = "city")
public class City {

    @Id
    @GeneratedValue
    @Column
    public Long _UID;

    @OneToOne(mappedBy="city", orphanRemoval = true, cascade=CascadeType.ALL)
    public Mayor mayor;
}

@Entity
@Table(name = "mayor")
public class Mayor {

    @Id
    @GeneratedValue
    @Column
    public Long _UID;

    @OneToOne(optional=false)
    public City city;
}
如果我尝试此交易:

City c = em.find(City.class, (long) 1);
AssertNotNull(c.getMayor());//gives true
Mayor m = new Mayor("Ed", "Lee");
c.setMayor(m);
m.setCity(c);
em.flush(); //This creates new Mayor and adds it to City, but don't delete an old one.
如果我先将mayor设置为null并刷新,然后再设置新的,则它可以工作:

City c = em.find(City.class, (long) 1);
AssertNotNull(c.setMayor());//gives true
c.setMayor(null);
em.flush();
Mayor m = new Mayor("Ed", "Lee");
c.setMayor(m);
m.setCity(c);
em.flush(); //This creates new Mayor and adds it to City, but don't deletes an old one.
我使用Hibernate4作为JPA2实现

  • 请删除
    (可选=false)
  • 您必须在
    em.flush()之后执行
    em.clear()

  • 这是Hibernate(实际上是JPA规范)中的一个已知问题


    有关问题背景和可能的解决方法的更多信息,请参阅。你可以投票支持同一个问题,因为前者已经结束。

    1。您可以不使用
    (可选=false)
    ???。。。2.您必须在
    em.flush()
    Thanx之后执行
    em.clear()
    (