繁体   English   中英

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

[英]Cascading save not working with Hibernate 4 and @OneToMany

我一直在使用Hibernate 4遇到问题,而在Hibernate 3中却没有发生。我正在测试一个基本的dao类,该类具有用于保存,查询等的通用方法。(不是它不是家庭作业)。 我正在将嵌入式derby连接与hibernate.hbm2ddl.auto = create-drop一起用于测试目的。

编辑:修复级联类型。 还是一样的行为。 即使我从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;
    }
}

然后我尝试保存:

FooChild fooChild = new FooChild();
fooChild.setId(1L);
fooChild.setName("fooChild");

FooParent fooParent = new FooParent();
fooParent.setId(1L);
fooParent.setName("fooParent");
fooParent.setFooChild(new ArrayList<FooChild>(Arrays.asList(fooChild)));

session.save(fooParent);
session.flush();
session.clear();

我得到以下跟踪:

org.hibernate.exception.ConstraintViolationException: INSERT on table 'FOO_PARENT_FOO' caused a violation of foreign key constraint 'FKF18290CAECA19CB8' for key (1).  The statement has been rolled back.
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)
...

我注意到正在执行以下sql:

Hibernate: 
    insert 
    into
        foo_parent
        (name, foo_parent_id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    insert 
    into
        foo_parent_foo
        (foo_parent, foo_child) 
    values
        (?, ?)

似乎在将保存级联到FooChild对象之前,它试图插入到集合中。

如果我将FooParent更改为:

@OneToMany(cascade={CascadeType.ALL})

问题解决了。

如我所说,这适用于休眠3,所以我不确定为什么它的行为有所不同。

save()persist()merge()是三个不同的操作。 如果要级联save()操作,则需要使用Hibernate批注

@Cascade(CascadeType.SAVE_UPDATE)

要么

cascade = CascadeType.ALL

,其中还包括Hibernate专有操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM