10

我有两个实体:

@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); 

在我的日志中,我看到一个插入到我的“文件”表中,两个插入到我的标签表中,但是,我的标签表中指向我的文件表 (file_id) 的外键为 NULL。

我可能做错了什么?

4

2 回答 2

17

您没有为标签设置文件,只是将标签设置为文件。请记住,在 OOP 中,与关系模型相反,您必须设置关系的两端。您不能仅仅因为您将一组标签添加到文件而从标签导航到文件。在您的情况下,您可以从文件导航到标签(即:列出文件的所有标签)。您无法仅通过查看标签来判断标签属于哪个文件。

通常所做的是其中一个模型中的辅助方法,如下所示:

public void addTag(Tag tag) {
  this.tags.add(tag);
  tag.setFile(this);
}

请参阅示例(来自 Hibernate 的测试套件):

于 2010-12-21T13:04:07.293 回答
3

数据库中的外键反映了状态Tag.file(因为Tag在双向多对一关系中,关系的拥有方是“多”方)。

我看不到你在哪里设置的。

于 2010-12-21T13:00:44.447 回答