託児リファレンス(外部キー):JPA @OneToMany - >親 - 私はこのような何かがある場合は私が子供Entites IR からParentEntitiesを参照について質問があり
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")
private Set<Child> children;
simple ... getter and setter ...
}
をそしてChild.javaは:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
@ManyToOne
private Parent parent;
... simple getter an setter
}
次の表は、作成しようとしている。
Parent:
int id
Child:
int id
int parent_id (foreign key: parent.id)
これまでのところ、永遠にうまくいきました。しかし、JavaからこのReferenceを使用する場合は、このようなことができると思います。データベースでこれにつながる
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
:
Parent:
id
100
Child
id paren_id
101 100
しかし、ケースをないthatsの、あなたが明示的に持っているが、私は、フレームワークは、おそらくによって行うことができると思うだろう、子供(の親を設定しました自体)。
のでいただきましたが、実際にデータベースにこのです:私は子供の親を設定していない
Parent:
id
100
Child
id paren_id
101 (null)
原因。だから私の質問:
私は本当にsthをする必要がありますか?このような?
Parent.java:
...
setChildren(Set<Child> children) {
for (Child child : children) {
child.setParent.(this);
}
this.children = children;
}
...
編集:
は速い回答によると、私はリファレンス所有エンティティに@JoinColumnを使用することで、この問題を解決することができました。例を上から取ると、私はsthしました。このような:
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name= "paren_id")
private Set<Child> children;
simple ... getter and setter ...
}
そしてChild.java:
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
リファレンスが正しくによって設定されます。今、私たちはこれを行う場合
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
... simple getter an setter
}
親:
Parent:
id
100
Child
id paren_id
101 100
ありがとうございました。
**子エンティティに親を持っていましたか?親がなければ、エラーが発生します(_StaleStateException:バッチ更新は、update [0]から予期しない行数を返しました;実際の行数:0; expected:1_)。注釈のない親を追加すると、エラーも表示されます(マッピングエラー)。子の親フィールドに@manytooneを設定すると、保存時にエラーが発生します(_ORA-00904: "REPORT_REPORT_ID":недопустимыйидентификатор_)。私のfkとidのIDはreport_idという名前だが、report_report_idがどこに来るのか分からない。 – Erlan
(EclipseLink JPA実装の使用) @Column(name = "paren_id")プライベートlong parenIdが必要であることは注目に値する。このwotの仕事のためのあなたの子供のマッピング。 – AfterWorkGuinness