(元の質問が変更された、以下の更新プログラムを参照してください。)休止 - 親IDが含まれている複合キーを使用して - OneToMany
私はトラブルの子オブジェクトの主キーを設定休止させることがあります。主キーは親の主キーと同じです。
これは、親がどのように見えるかです:
@Entity
@Table(name = "PARENT")
@SequenceGenerator(name = "SEQ", allocationSize = 1, sequenceName = "seq_parent_id")
public class Parent {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ")
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
@JoinColumn(name = "PARENT_ID")
private Set<Child> children;
これは、子供がどのように見えるかです:私は、保存しようとしていますJUnitのリポジトリのテストを実行すると、
今@Entity
@Table(name = "CHILDREN")
public class Child {
@Id
@Column(name = "PARENT_ID")
private Long parentId;
親エンティティと子エンティティがある場合、例外が発生します。
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ...
h ibernateは自動的にChild.parentIdをparent.idに設定しますか?
私は子供に親を与えようとしました。しかし、ParentはIdではないので、他の例外もありました。
UPDATE
私は子供のIdが本当の主キーではないことに気づきました。これは単なるマッピングキーです。 parent.idには複数の子エントリがあります。親IDと、さらに2つの文字列値:
子の主キーは3つの値のうち複合キーです:
アップデートは今、私は私が本当に必要なものを実現し始めます。
@Entity
@Table(name = "CHILDREN")
public class Child {
@Column(name = "PARENT_ID")
private Long parentId;
@Column(name = "PROPERTY_NAME")
private String propertyName;
@Column(name = "ANOTHER_PROPERTY")
private String anotherProperty;
@Column(name = "PROPERTY_VALUE")
private String propertyValue;
したがって、parentId、properyNameおよびanotherPropertyを使用して複合キーをマップする必要があります。 propertyValueはそのエントリの実際の値です。
IdClassまたはembeddedIdを使用する必要があると思います。私は試しましたが、今まで成功していませんでした。
リレーションシップの反対側にJoinColumnを宣言する必要があります。 'Child'クラスで' @ ManyToOne'関係を宣言します。しかし、IMOでは、設計上の問題があります。「親」に複数の「子」がある場合、「親」が「子」の主キーになる可能性はありますか? (いくつかの 'Child'は同じ' Parent'と同じプライマリキーを持ちます)。 –
ああ、そうです。それは本当のプライマリキーではありません!それは単なる鍵です!テーブルには実際のIDはありません。 – Nina