2

私は古典的な1対多の関係を持っており、Hibernateで保存している間、親のPK列の値を子のFK列に渡すことができません。
親クラス

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int holdingPK;

@OneToMany(mappedBy="holding",targetEntity=PolicyType.class,fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@XmlElement(name = "Policy")
private Set<PolicyType> policy;

チャイルドクラス

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int policyPK;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="HoldingFK",nullable = false)
private HoldingType holding;

これHoldingPKは、主キーを表す自動生成されたシーケンス列です。Holding行を挿入すると値が生成されます。そのため、HoldingPK値をHoldingFKその場で子の列に渡したいと思います。
テストコード

HoldingType obj = new HoldingType();
obj.setCurrencyTypeCode("6");
obj.setHoldingKey("123");
Set<PolicyType> set = new TreeSet<PolicyType>();
PolicyType policy = new PolicyType();
policy.setJurisdiction("Haha");
set.add(policy);
obj.setPolicy(set);
session.save(obj);
transaction.commit();

したがって、子の他の値を子テーブル列に渡すことができます。親PKだけが子のFK列に到達していません。

ここでは、XMLドキュメントの値をデータベースに永続化しています。このために、JAXBを使用してXMLをJavaオブジェクトにマーシャリングしてから、Hibernateを使用してオブジェクトを永続化します。このようにして、JAXBで生成されたクラスをHibernateで再利用していますが、これらのPK要素とFK要素はXMLに存在しません。これらはデータベースに固有です。

4

1 に答える 1

2

双方向関連の所有側を初期化するのを忘れただけです。逆側(mappedBy属性を持つ側)のみを初期化しました。Hibernate は、アソシエーションが存在するかどうかを所有側 (mappedBy属性のない側) のみが認識していると見なします。

これをコードに追加します (保持が保存される前に):

policy.setHolding(obj);

policy補足:フィールド (およびアクセサー)に名前を付けると、コードがはるかに読みやすくなりますpolicies。数が多いので、複数形にする必要があります。

于 2012-07-12T13:57:07.110 に答える