6

Hibernate 3 では発生しなかった Hibernate 4 の問題が発生しています。保存、クエリなどの汎用メソッドを持つ基本 dao クラスをテストしています (宿題ではありません)。テスト目的で、hibernate.hbm2ddl.auto=create-drop を使用して組み込みの derby 接続を使用しています。

編集: cascadeType を修正します。それでも同じ動作です。CascadeType 列挙型から使用可能なすべてのカスケード型を追加しても、CascadeType.ALL を配置しない限り失敗します。具体的に列挙できない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 で動作するので、なぜ動作が異なるのかわかりません。

4

1 に答える 1

4

save()persist()およびmerge()3 つの異なる操作です。操作をカスケードするsave()場合は、Hibernate アノテーションを使用する必要があります

@Cascade(CascadeType.SAVE_UPDATE)

また

cascade = CascadeType.ALL

これには、Hibernate 独自の操作も含まれます。

于 2012-06-28T21:52:19.340 に答える