休眠不设置外键
我试图学习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)未设置并保持为空。我错过了什么?
你必须设置为双向关系,双方的关系问题。
因此,您必须将您的关系设置为CD
和您的Track
对象,然后保留/合并它们。
没有看到你的许多代码,你必须做类似的事情。
cd.getTracks().add(track);
track.setCD(cd);
session1.save(track);
session1.save(cd);
有关更多详细信息,请参见another question。
谢谢你的男人!我已经有了setTb2方法,但是当我将数据库中的对象tb2保存在数据库中时,我并没有调用它,所以这就是问题所在! – untruste
您还可以使用级联注释来隐式地持久化或合并相关实体,请参阅https://vladmihalcea.com/2015/03/05/a-beginners-guide-to-jpa-and-hibernate-cascade-types/ for更多信息。 –
为了让FK填充在数据库中,您只需要拥有要填充关系的一方。 (然而,你仍然应该让双方都不是因为Hibernate而填充,而仅仅是因为实体的一致性) –
我觉得你的表2
private tb2 cd;
的类型应该随
private CD cd;
这是一个很好的捕获 –
我不相信这是错误。因为如果它是代码将不会编译。但这不是OP面临的问题。 –
什么类型的列表是CD类中的曲目。 TB1?添加你的整个代码。 –
我假定它的私人列表
@RohitGaikwad是的! – untruste