Java 初始化后删除hibernate enum@elementcollection

Java 初始化后删除hibernate enum@elementcollection,java,hibernate,collections,enums,mapping,Java,Hibernate,Collections,Enums,Mapping,我有一个简单的枚举: public enum Privilege implements Serializable { P1, P2, P3; } 映射到如下实体中: @Entity @Table(name = "rol_roles", uniqueConstraints = {...) public class Role extends AbstractSomething { ... @ElementCollection(targetCl

我有一个简单的枚举:

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;
    }
}
create table rol_roles_privileges (
        role_id int8 not null,
        privilege varchar(255) not null,
        primary key (role_id, privilege)
    );
由于集合是惰性的,所以privilege和delete语句将继续进行集合初始化。我尝试按照类似线程中的建议添加@OrderColumn注释,但没有帮助。 在类似的情况下,并没有insert语句,所以读取对象只是刷出集合。 表是这样创建的:

@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;
    }
}
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\u lazy\u load\u no\u trans时,hibernate 4.2似乎有问题。 此错误可能与

它正在记录: 日志: 错误AssertionFailure:43-HHH000099:发生了断言失败(这可能表示Hibernate中存在错误,但更可能是由于会话使用不安全):org.Hibernate.AssertionFailure:集合所有者与会话不关联:org.Hibernate.test.ondemandload.Store.Inventures WARN AbstractPersistentCollection:246-无法关闭用于加载与无会话关联的惰性集合的临时会话

我现在使用的是Hibernate4.1.7,所有这些都可以在惰性加载下正常工作