Java 级联保存不适用于Hibernate 4和@OneToMany
我在Hibernate4中遇到了一个问题,这个问题在Hibernate3中没有发生。我正在测试一个基本dao类,它具有用于保存、查询等的通用方法。。(这不是家庭作业)。出于测试目的,我正在使用带有hibernate.hbm2ddl.auto=createdrop的嵌入式derby连接 编辑:修复级联类型。还是一样的行为。即使我从CascadeType枚举中添加了所有可用的级联类型,它仍然会失败,除非我放置CascadeType.all。不确定有什么是你不能具体列举的 在我的测试中,我有以下映射类:Java 级联保存不适用于Hibernate 4和@OneToMany,java,hibernate,jpa,dao,Java,Hibernate,Jpa,Dao,我在Hibernate4中遇到了一个问题,这个问题在Hibernate3中没有发生。我正在测试一个基本dao类,它具有用于保存、查询等的通用方法。。(这不是家庭作业)。出于测试目的,我正在使用带有hibernate.hbm2ddl.auto=createdrop的嵌入式derby连接 编辑:修复级联类型。还是一样的行为。即使我从CascadeType枚举中添加了所有可用的级联类型,它仍然会失败,除非我放置CascadeType.all。不确定有什么是你不能具体列举的 在我的测试中,我有以下映射类
@Entity
@Table(name="FOO_CHILD")
public class FooChild {
@Id
@Column(name="FOO_ID")
private Long id;
@Column(name="NAME")
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
@Table(name="FOO_PARENT")
public class FooParent {
@Id
@Column(name="FOO_PARENT_ID")
private Long id;
@Column(name="NAME")
private String name;
@Fetch(FetchMode.SELECT)
@Type(type="long")
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name="FOO_PARENT_FOO",
joinColumns={@JoinColumn(referencedColumnName="FOO_PARENT_ID")},
inverseJoinColumns={@JoinColumn(referencedColumnName="FOO_ID")})
private List<Foo> fooChild;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Foo> getFooChild() {
return fooChild;
}
public void setFooChild(List<Foo> fooChild) {
this.fooChild = fooChild;
}
}
我注意到正在执行以下sql:
Hibernate:
insert
into
foo_parent
(name, foo_parent_id)
values
(?, ?, ?, ?)
Hibernate:
insert
into
foo_parent_foo
(foo_parent, foo_child)
values
(?, ?)
它似乎试图在将save级联到FooChild对象之前插入到集合中
如果我将FooParent更改为具有以下内容:
@OneToMany(cascade={CascadeType.ALL})
问题消失了
正如我所说的,这适用于hibernate 3,因此我不确定为什么它的行为会有所不同。save()
、persist()
和merge()
是三种不同的操作。如果要级联save()
操作,则需要使用Hibernate注释
@Cascade(CascadeType.SAVE_UPDATE)
或
,其中还包括Hibernate专有操作。
cascade={CascadeType.MERGE,CascadeType.MERGE}
:此处没有用于保存更新的级联。抱歉,我尝试了几项操作,但返回的内容有错误。它应该是CascadeType.PERSIST,CascadeType.mergeThank。一般来说,我尽量避免使用特定于hibernate的注释。虽然我的一般意见是JPA规范相当不完整。更不用说JPAAPI比hibernate更难使用。特别是CriteriaBuilder。如果要避免特定于Hibernate的注释(我可以理解),还应该避免特定于Hibernate的方法,例如save()、saveOrUpdate()和update()。坚持使用persist()
和merge()
,您将不需要特定于Hibernate的注释。
@OneToMany(cascade={CascadeType.ALL})
@Cascade(CascadeType.SAVE_UPDATE)
cascade = CascadeType.ALL