私は(春に)注釈付きのHibernateを使用しており、順序付けられた多対1の関係を持つオブジェクトがあります。このオブジェクトは、複合主キーを持つ子オブジェクトであり、その1つのコンポーネントは外部キーに戻ります。親オブジェクトのID。
構造は次のようになります。
+=============+ +================+
| ParentObj | | ObjectChild |
+-------------+ 1 0..* +----------------+
| id (pk) |-----------------| parentId |
| ... | | name |
+=============+ | pos |
| ... |
+================+
注釈のさまざまな組み合わせを試しましたが、どれも機能していないようです。これは私が思いついた最も近いものです:
@Entity
public class ParentObject {
@Column(nullable=false, updatable=false)
@Id @GeneratedValue(generator="...")
private String id;
@OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
@IndexColumn(name = "pos", base=0)
private List<ObjectChild> attrs;
...
}
@Entity
public class ChildObject {
@Embeddable
public static class Pk implements Serializable {
@Column(nullable=false, updatable=false)
private String parentId;
@Column(nullable=false, updatable=false)
private String name;
@Column(nullable=false, updatable=false)
private int pos;
@Override
public String toString() {
return new Formatter().format("%s.%s[%d]", parentId, name, pos).toString();
}
...
}
@EmbeddedId
private Pk pk;
@ManyToOne
@JoinColumn(name="parentId")
private ParentObject parent;
...
}
私は長い実験の末にこれに到達しました。そこでは、他のほとんどの試みで、さまざまな理由で休止状態にさえロードできないエンティティが生成されました。
更新:コメントをありがとう。私はいくつかの進歩を遂げました。私はいくつかの調整を行いましたが、より近いと思います(上記のコードを更新しました)。ただし、現在、問題は挿入にあります。親オブジェクトは正常に保存されているように見えますが、子オブジェクトは保存されていません。私が判断できたのは、休止状態が子オブジェクトの(複合)主キーのparentId部分を埋めていないためです。 m一意ではないエラーが発生する:
org.hibernate.NonUniqueObjectException:
a different object with the same identifier value was already associated
with the session: [org.kpruden.ObjectChild#null.attr1[0]]
自分のコードに属性name
とpos
属性を入力していますが、親IDはまだ保存されていないため、もちろんわかりません。これを記入するように休止状態を説得する方法についてのアイデアはありますか?
ありがとう!