2

私は、双方向のOneToOne関係と少し混乱しています。これは、両端でオプションではない可能性があります。私はHibernateでJPA2を使用しています:

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

    @Id
    @GeneratedValue
    @Column
    public Long _UID;

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

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

    @Id
    @GeneratedValue
    @Column
    public Long _UID;

    @OneToOne(optional=false, cascade=CascadeType.ALL)
    public City city;
}

そして、このトランザクションを試してみると:

Mayor m = new Mayor("Ed", "Lee");
City c = new City("San Francisco", 100000);
m.setCity(c);
c.setMayor(m);

EntityTransaction et = this.getEm().get().getTransaction();
et.begin();

this.getEm().get().persist(c);
this.getEm().get().flush();

et.commit();

次の例外が発生します。

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: test.persistence.entity.Mayor.city

City永続化する前にインスタンスを検査するMayorと、適切な場所にインスタンスがあり、このMayorインスタンスにはインスタンスに戻る関係が設定されていCityます。

シティ側だけでoptional=false大丈夫です。

4

1 に答える 1

1

これは、両側で cascadeAll を使用してマッピングに循環依存があるためです。

そこで何が起こるかというと、市長を保存する都市を保存し、市長を保存してから、まだ永続化されていない都市を保存しているため (そもそも保存しようとしているため)、休止状態は都市を参照する方法を知らないということです。 DBで。

カスケード タイプの永続化を削除するには、mayor クラスの都市フィールドのカスケードを微調整する必要があります。

[編集] また、関係の責任者は市長であるようです (mappedby は都市クラスにあるため)。あなたが都市を永続化しようとしているように、都市は関係を担当する必要があると思います(したがって、mappedBy 属性は市長クラスにある必要があります)。

于 2013-02-26T11:25:52.120 に答える