私は単純な列挙型を持っています:
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 を使用しています。