初始化后删除了hibernate enum @elementcollection

时间:2013-10-24 15:02:00

标签: 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(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;
    }
}

现在,当我尝试使用填充元素保存实体时 - 一切都很好 - 实体保存没有问题。当我尝试从数据库中获取实体时,hibernate决定他不喜欢我的收藏,删除它。日志中的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时,奇怪的(或者可能不是)它也有效 - 但它也不应该在懒惰上工作吗?

我正在使用hibernate 4.2.0.Final,SpringData,PostreSQL和hibernate.enable_lazy_load_no_trans

1 个答案:

答案 0 :(得分:2)

对于未来的googlers: 使用enable_lazy_load_no_trans时,似乎hibernate 4.2是错误的。 此错误可能与https://hibernate.atlassian.net/browse/HHH-7524

有关

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

我现在正在使用hibernate 4.1.7,所有这些都可以在延迟加载时正常工作。