我有一个关于Hibernate的一般性问题,我正在与之讨论。
我有A类和B类,其中B依赖于A
在我的代码中,当我调用em.persist(objOfTypeA)时,我希望插入内容能够插入到表AAA和BBB中。如果我手动使用A获取A的ID并将其填写在每个对象的列表中,然后保留该列表,则说明一切正常。但是我希望Hibernate 能够 神奇地 做到这一点。
难道我做错了什么?还是我只是对Hibernate期望过高?
谢谢
@Entity @Table(name = "AAA") @Veto public class A { @Id @GeneratedValue @Column(name = "Id") private Long id; @NotNull @Column(name = "Name") private Long name; ... @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) private List<B> b; ... } @Entity @Table(name = "BBB") @Veto public class B { @Id @GeneratedValue @Column(name="Id") private Long id; @NotNull @Column(name="AId") private Long aId; @NotNull @Column(name = "Name") private Long name; @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false) @ManyToOne(optional = false) private A a; ... }
我终于解决了。给出或发现的所有示例都没有告诉我到底是什么问题,只有经过自己的试验,我才得出以下结论:
而不是
@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) private List<B> b;
那行不通(FK仍为NULL)
这确实有效:
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) @JoinColumn(name="AId") @NotNull private List<B> b;