我有两个实体:
@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中,与关系模型相反,您必须设置关系的两端。您不能仅从标签导航到文件,因为您已向文件添加了一组标签。就您而言,您可以从文件导航到标签(即:列出文件的所有标签)。仅通过查看标签就无法确定标签属于哪个文件。
通常在其中一个模型中执行一个辅助方法,如下所示:
public void addTag(Tag tag) { this.tags.add(tag); tag.setFile(this); }
请参见以下示例(来自Hibernate的测试套件):