Hibernateは、外部キーを挿入せずにカスケードを挿入します
-
12-10-2019 - |
質問
私には2つのエンティティがあります:
@Entity
public class File
.......
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@OneToMany(fetch=FetchType.LAZY, mappedBy="file", cascade=CascadeType.ALL)
private List<Tag> tags;
.......
OTHER PROPERTIES
.......
@Entity
public class Tag
.......
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="file_id")
private File file;
@Column
private String tag;
.......
OTHER PROPERTIES
.......
以下を実行して、ファイルに挿入しようとしています(およびその後のタグ)。
File file = new File();
Tag tag = new Tag();
tag.setTag("tag1");
Tag2 tag2 = new Tag();
tag2.setTag("tag2");
List<Tag> tags = new ArrayList<Tag>();
tags.add(tag);
tags.add(tag2);
file.setTags(tags);
---Add other file attributes here---
次に、次のようにDAOにファイルを挿入しています。
sessionFactory.getCurrentSession().saveOrUpdate(file);
私のログには、「ファイル」テーブルに挿入され、タグテーブルに2つの挿入が表示されますが、ファイルテーブル(file_id)を指すタグテーブルの外部キーはnullです。
何が間違っているのでしょうか?
解決
タグのファイルを設定するのではなく、タグのみをファイルに設定しています。 OOPでは、リレーショナルモデルとは対照的に、関係の両端を設定する必要があることを忘れないでください。ファイルにタグのセットを追加したからといって、タグからファイルへとナビゲートできません。あなたの場合、ファイルからタグにナビゲートできます(つまり、ファイルのすべてのタグをリストします)。タグのみを見ることで、どのファイルが属しているかを知ることはできません。
通常行われるのは、このようなモデルの1つのヘルパーメソッドです。
public void addTag(Tag tag) {
this.tags.add(tag);
tag.setFile(this);
}
見る これ 例として(Hibernateのテストスイートから):
他のヒント
データベースの外部キーは、の状態を反映しています Tag.file
(以来 Tag
関係の所有側は、双方向の多くの関係における「多くの」側面としてです)。
どこに設定したかわかりません。
所属していません StackOverflow