为啥 Hibernate 不填充这个外键列

Posted

技术标签:

【中文标题】为啥 Hibernate 不填充这个外键列【英文标题】:Why is Hibernate not filling this foreign key column为什么 Hibernate 不填充这个外键列 【发布时间】:2014-04-11 04:52:23 【问题描述】:

这个问题似乎经常发生,但我找不到适合我的情况的有效解决方案。问题是 Hibernate 将一个外键列的外键留空(null)。奇怪的是,我在另一个程序中使用这两个受影响的表的相同设置并且它工作正常。唯一不同的是我现在添加了另外 2 个表。

我检查了 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】:

您管理协会的双方吗?这意味着您将Tag 添加到Page 中的Set&lt;Tag&gt; 并在Tag 上设置Page 字段?

在将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>`

【讨论】:

该死的:D ...非常感谢! @很高兴我能帮上忙!起初我也为此苦苦挣扎。

以上是关于为啥 Hibernate 不填充这个外键列的主要内容,如果未能解决你的问题,请参考以下文章

为啥 InnoDB 为外键列添加索引

hibernate笔记--基于主键的单(双)向的一对一映射关系

vs Dataset DataTable 中未显示外键列

hibernate映射postgreSQL数据库中的表时,表名是大写的时候为啥hibernate不能映射实体

Hibernate映射

Hibernate:如何将自动生成的外键列名从小写更改为大写