我有这样的映射(单向):
@Entity
@Table(name = "MY_TEMPLATE")
public class MyTemplate {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, updatable = false)
private Long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MY_TEMPLATE_ID")
private List<MyObject> myObjects = new ArrayList<>();
...
}
@Entity
@Table(name = "MY_OBJECT")
public class MyObject implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, updatable = false)
private Long id;
}
然后我写这样的代码:
MyTemplate mt = new MyTemplate();
mt.setField1(someVal1);
mt.setField2(someVal2);
mt.setField3(someVal2);
MyObject mdr = new MyObject ();
mt.getMyObjects.add(mdr);//!!!
mdr.setFfld1(smVal1);
mdr.setFfld2(smVal2);
mdr.setFfld3(smVal3);
crudRepository.save(mt);
Hibernate为此生成3个查询:
MY_TEMPLATE
,field1
和field2
插入field3
MY_OBJECT
,fld1
和fld2
插入fld3
MY_OBJECT
表的设置外键是否可以强制休眠将FK和insert插入MY_OBJECT
表中?
答案 0 :(得分:0)
Vlad Mihalcea在他的article about 1-many relationships中对此进行了解释。
如果您查看Hibernate刷新顺序,就会发现在处理集合元素之前执行了persist操作。这样,由于子实体不存储此信息,因此Hibernate首先插入没有外键的子记录。在集合处理阶段,“外键”列将相应更新。
他建议将该关系反转为@ManyToOne
关系或由许多一方控制的双向关系。
答案 1 :(得分:0)
我确实关注并帮助了我们
@JoinColumn(name = "MY_TEMPLATE_ID", nullable = false)