2

私は単純な列挙型を持っています:

public enum Privilege implements Serializable {        
   P1,
   P2,
   P3;
}

次のようなエンティティにマップされます。

@Entity
@Table(name = "rol_roles",
    uniqueConstraints = {...)
public class Role extends AbstractSomething {

 ...

    @ElementCollection(targetClass = Privilege.class, fetch = FetchType.LAZY) 
    @CollectionTable(name = "rol_roles_privileges", 
        joinColumns =
        @JoinColumn(name = "role_id"))
    @Column(name = "privilege", nullable = false)
    @Enumerated(EnumType.STRING)
    private Set<Privilege> privileges = EnumSet.noneOf(Privilege.class);

    public Set<Privilege> getPrivileges() {
        return privileges;
    }

    public void setPrivileges(Set<Privilege> privileges) {
        this.privileges = privileges;
    }
}

さて、塗りつぶされた要素でエンティティを保存しようとすると、問題なくエンティティが保存されます。データベースからエンティティを取得しようとすると、休止状態が私のコレクションが気に入らないと判断し、コレクションを削除します。ログからのSQL:

Hibernate: 
    select
        role0_.id as id1_6_,
        role0_.version_num as version2_6_,
        role0_.code as code3_6_,
        role0_.comments as comments4_6_,
        role0_.title as title5_6_,
        role0_.title_en as title6_6_,
        role0_.valid_from as valid7_6_,
        role0_.valid_till as valid8_6_ 
    from
        rol_roles role0_ 
    where
        role0_.id=? 
 Hibernate: 
    select
        privileges0_.role_id as role1_6_0_,
        privileges0_.privilege as privileg2_7_0_,
    from
        rol_roles_privileges privileges0_ 
    where
        privileges0_.role_id=? 
 Hibernate: 
    delete 
    from
        rol_roles_privileges 
    where
        role_id=?

コレクションは遅延しているため、特権および削除ステートメントはコレクションの初期化に進みます。同様のスレッドで提案されているように @OrderColumn アノテーションを追加しようとしましたが、それは役に立ちませんでした。同様のケースのような挿入ステートメントがないため、オブジェクトの読み取りはコレクションをスワイプするだけです。テーブルは次のように作成されます。

create table rol_roles_privileges (
        role_id int8 not null,
        privilege varchar(255) not null,
        primary key (role_id, privilege)
    );

奇妙なことに (あるいはそうでないかもしれませんが) fetchtype.EAGER を設定すると動作しますが、lazy でも動作するべきではありませんか?

私は hibernate 4.2.0.Final、SpringData、PostreSQL、および hibernate.enable_lazy_load_no_trans を使用しています。

4

1 に答える 1

2

将来の Google 社員向け: enable_lazy_load_no_trans を使用すると、hibernate 4.2 にバグがあるようです。このバグはhttps://hibernate.atlassian.net/browse/HHH-7524に関連している可能性があります

ログ: ログ: ERROR AssertionFailure:43 - HHH000099: アサーション エラーが発生しました (これは Hibernate のバグを示している可能性がありますが、セッションの安全でない使用が原因である可能性が高くなります): org.hibernate.AssertionFailure: コレクションの所有者が関連付けられていませんセッション: org.hibernate.test.ondemandload.Store.inventories WARN AbstractPersistentCollection:246 - セッションに関連付けられていない遅延コレクションをロードするために使用される一時セッションを閉じることができません

現在、休止状態 4.1.7 を使用していますが、すべて遅延読み込みで正常に動作します。

于 2013-10-25T11:29:28.170 に答える