我有两个实体:

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

然后,我使用以下方式将文件插入:

sessionFactory.getCurrentSession().saveOrUpdate(file); 

在我的日志中,我看到了我的“文件”表中的一个插入物,并在标签表中插入2个插入,但是,标签表中指向文件表(file_id)的外键是null。

我可能做错了什么?

有帮助吗?

解决方案

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

通常在其中一个模型中做的是辅助方法,例如:

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

这个 例如(来自Hibernate的测试套件):

其他提示

数据库中的外键反映了 Tag.file (自从 Tag 在双向多对一关系中,关系的自有方面是“许多”方面。

我看不到你设置在哪里。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top