为什么Hibernate没有填充这个外键列

时间:2014-03-07 20:43:59

标签: java mysql hibernate orm

这个问题似乎经常发生,但我无法为我的案例找到一个有效的解决方案。问题是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();
}

我们非常感谢您的每一个建议!

1 个答案:

答案 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>`
相关问题