Hibernate 休眠插入级联不插入外键

Hibernate 休眠插入级联不插入外键,hibernate,one-to-many,many-to-one,Hibernate,One To Many,Many To One,我有两个实体: @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 ....... @En

我有两个实体:

@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_id)的外键为空


我可能做错了什么?

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


我看不出您在哪里设置它。

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

通常在其中一个模型中使用助手方法,如下所示:

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

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

谢谢,这很有效。出于某种原因,我真的认为Hibernate会为我做出这样的假设,即我希望它是标记,并用我的文件进行更新,因为我在两侧都对关系进行了注释。链接不存在更多:(您可以提供其他来源?我已将答案更改为指向最新版本。抱歉,我有相同的dubt..我不明白为什么hibernate不将文件的id放在保存的标记中。其他id可以是什么,如果不是我当时保存的文件的id,为什么hibernate不获取该id?我不插入它标签的FK?为什么Hibernate不能?
sessionFactory.getCurrentSession().saveOrUpdate(file); 
public void addTag(Tag tag) {
  this.tags.add(tag);
  tag.setFile(this);
}