这个问题似乎经常发生,但我无法为我的案例找到一个有效的解决方案。问题是Hibernate将一个外键列的外键留空(null)。奇怪的是,我在另一个程序中使用这两个受影响的表的相同设置,它工作正常。唯一的区别是我现在添加了另外两个表。
我检查了MySQL输出(通过show_sql选项),Hibernate在子进程之前插入父表。所以关键应该在那里。
父:
public class Page {
@Id
@GeneratedValue
@Column(name="page_id")
private Integer id;
//****** THIS IS THE CHILD
@OneToMany(orphanRemoval=true, mappedBy="pageId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Tag> tag = new HashSet<Tag>();
//****** THESE ARE THE NEW TABLES
@OneToOne(cascade=CascadeType.ALL)
private Video video;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="creator_id")
private Creator creator;
子:
public class Tag {
@Id
@GeneratedValue
private Integer id;
@Index(name = "tag")
@Column
private String tag;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="page_id")
private Page pageId;
如何保存(必须使用saveOrUpdate):
public static void save(SessionFactory sessionFactory, Page page) {
Session session = sessionFactory.openSession();
session.beginTransaction();
session.saveOrUpdate(page);
session.getTransaction().commit();
session.close();
}
我们非常感谢您的每一个建议!
答案 0 :(得分:2)
您是否管理协会的双方?这意味着您将Tag
添加到Set<Tag>
中的Page
并在Page
上设置Tag
字段?
在将Page
传递给save
方法之前,您应按以下方式管理关系:
Page page = new Page();
Tag tag = new Tag();
//managing the both sides of the relationship
tag.setPage(page); //Setting Tags page field
page.getTags().add(tag); //Adding tag to the `Set<Tag>`