Java 级联保存不适用于Hibernate 4和@OneToMany

Java 级联保存不适用于Hibernate 4和@OneToMany,java,hibernate,jpa,dao,Java,Hibernate,Jpa,Dao,我在Hibernate4中遇到了一个问题,这个问题在Hibernate3中没有发生。我正在测试一个基本dao类,它具有用于保存、查询等的通用方法。。(这不是家庭作业)。出于测试目的,我正在使用带有hibernate.hbm2ddl.auto=createdrop的嵌入式derby连接 编辑:修复级联类型。还是一样的行为。即使我从CascadeType枚举中添加了所有可用的级联类型,它仍然会失败,除非我放置CascadeType.all。不确定有什么是你不能具体列举的 在我的测试中,我有以下映射类

我在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