如何强制休眠将外键值与常规插入一起插入表?

时间:2018-09-05 07:19:48

标签: java hibernate jpa spring-data-jpa foreign-keys

我有这样的映射(单向):

@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个查询:

  1. MY_TEMPLATEfield1field2插入field3
  2. MY_OBJECTfld1fld2插入fld3
  3. 更新MY_OBJECT表的设置外键

是否可以强制休眠将FK和insert插入MY_OBJECT表中?

2 个答案:

答案 0 :(得分:0)

Vlad Mihalcea在他的article about 1-many relationships中对此进行了解释。

  

如果您查看Hibernate刷新顺序,就会发现在处理集合元素之前执行了persist操作。这样,由于子实体不存储此信息,因此Hibernate首先插入没有外键的子记录。在集合处理阶段,“外键”列将相应更新。

他建议将该关系反转为@ManyToOne关系或由许多一方控制的双向关系。

答案 1 :(得分:0)

我确实关注并帮助了我们

@JoinColumn(name = "MY_TEMPLATE_ID", nullable = false)