質問

私には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 関係の所有側は、双方向の多くの関係における「多くの」側面としてです)。

どこに設定したかわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top