2016-10-03 98 views
1

我试图学习Hibernate的这个简单的例子,但我对数据库中仍然为“空”的外键有这么麻烦。休眠不设置外键

@Entity 
@Table(name = "tb1") 
public class Track { 
    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="id_tb1", unique= true) 
    private int id_tb1; 
    @Column(name = "title") 
    private String title; 
    @ManyToOne 
    @JoinColumn(name="id_tb2") 
    private tb2 cd; 

这是第二类

@Entity 
@Table(name = "tb2") 
public class CD { 

    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="id_tb2", unique = true) 
    private int id_tb2; 
    @Column(name="title") 
    private String title; 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL,mappedBy = "cd") 
    private List<tb1> tracks = new ArrayList<tb1>(); 

我保存这样的:

SessionFactory factory = new Configuration().configure("/resources/hibernate.cfg.xml").buildSessionFactory(); 
       Session session1 = factory.openSession(); 
       session1.beginTransaction(); 
       session1.save(tb2); 
       session1.getTransaction().commit(); 

但当Isavethe id_tb2(在表TB1)未设置并保持为空。我错过了什么?

+0

什么类型的列表是CD类中的曲目。 TB1?添加你的整个代码。 –

+0

我假定它的私人列表 tracks = new ArrayList ();在CD类而不是私人列表 tracks = new ArrayList (); –

+0

@RohitGaikwad是的! – untruste

回答

2

你必须设置为双向关系,双方的关系问题。

因此,您必须将您的关系设置为CD和您的Track对象,然后保留/合并它们。

没有看到你的许多代码,你必须做类似的事情。

cd.getTracks().add(track); 
track.setCD(cd); 
session1.save(track); 
session1.save(cd); 

有关更多详细信息,请参见another question

+0

谢谢你的男人!我已经有了setTb2方法,但是当我将数据库中的对象tb2保存在数据库中时,我并没有调用它,所以这就是问题所在! – untruste

+0

您还可以使用级联注释来隐式地持久化或合并相关实体,请参阅https://vladmihalcea.com/2015/03/05/a-beginners-guide-to-jpa-and-hibernate-cascade-types/ for更多信息。 –

+1

为了让FK填充在数据库中,您只需要拥有要填充关系的一方。 (然而,你仍然应该让双方都不是因为Hibernate而填充,而仅仅是因为实体的一致性) –

1

我觉得你的表2

private tb2 cd; 

的类型应该随

private CD cd; 
+0

这是一个很好的捕获 –

+0

我不相信这是错误。因为如果它是代码将不会编译。但这不是OP面临的问题。 –