Java 休眠不设置外键

Java 休眠不设置外键,java,mysql,hibernate,Java,Mysql,Hibernate,我试图用这个简单的例子来学习Hibernate,但是在数据库中保持“null”的外键方面我遇到了很多麻烦 @Entity @Table(name = "tb1") public class Track { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name="id_tb1", unique= true) private int id_tb1; @Column(name =

我试图用这个简单的例子来学习Hibernate,但是在数据库中保持“null”的外键方面我遇到了很多麻烦

@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>();

但当ISAVE时,id_tb2(在表tb1中)未设置且保持为空。我遗漏了什么?

我认为你们的表格类型是2

private tb2 cd;
应改为

private CD cd;

问题是,您必须为双向关系设置两侧的关系

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

在不查看大部分代码的情况下,您必须执行以下操作

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

有关更多详细信息,请参阅。

CD类曲目的列表类型。tb1?添加整个代码。我假设它的私有列表tracks=new ArrayList();在CD类中而不是在私有列表中跟踪=new ArrayList()@是的!你不能叫它
cd
&
track
而不是
tb1
tb2
?这是一个很好的例子,我不相信这是错误的。因为如果是这样,代码甚至不会编译。但这不是OP面临的问题,谢谢你!我已经有了方法setTb2,但是当我在数据库中保存对象tb2时,我没有调用它,所以这就是问题所在!您还可以使用级联批注隐式保留或合并相关实体。有关详细信息,请参见。为了在DB中填充FK,您只需要填充拥有关系的一方。(但是,您仍然应该使两侧都填充,这不是因为Hibernate,而是因为实体中的一致性)
cd.getTracks().add(track);
track.setCD(cd);
session1.save(track);
session1.save(cd);