我有一个关于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;
...
}
答案 0 :(得分:2)
我终于解决了。 我给出或发现的所有例子都没有告诉我究竟出了什么问题,只有在我自己的实验之后才能得出这个结论:
而不是
@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;
答案 1 :(得分:1)
修改类B
的映射,如下所示
@Entity
@Table(name = "BBB")
@Veto
public class B {
@Id
@GeneratedValue
@Column(name="Id")
private Long id;
@NotNull
@Column(name="AId", updatable = false, insertable = false)
private Long aId;
@NotNull
@Column(name = "Name")
private Long name;
@JoinColumn(name = "AId", referencedColumnName="Id")
@ManyToOne(optional = false)
private A a;
...
}
你在错误的地方使用了updatable = false, insertable = false
属性,我已经纠正过了。
阅读here以了解它们的工作原理。