2

双方向のOneToOne関係、および孤立したものの削除について少し混乱しています。これらは私のエンティティです:

@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.

市長を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.

私はJPA2の実装としてHibernate4を使用しています。

4

2 に答える 2

1

これはHibernate(および実際にはJPA仕様)の既知の問題です。

問題の背景と考えられる回避策の詳細については、このバグレポートを参照してください。前者はすでに閉鎖されているため、同じ問題について投票できる別のチケットがあります。

于 2013-03-02T16:55:02.383 に答える
0
  1. 削除してください(optional=false)
  2. あなたはem.clear()後にしなければなりませんem.flush()
于 2013-03-01T22:42:28.287 に答える