Hibernate Cascade PERSIST

时间:2012-02-25 11:21:03

标签: hibernate jpa cascade persist

我有一个关于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;
...     
}

2 个答案:

答案 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以了解它们的工作原理。