将一些布尔属性映射为枚举在Hibernate中设置

Xtr*_*ica 5 java hibernate

我有一个实体,它在数据库中有一些BIT字段:

  • 编辑
  • needs_review
  • 活性

这些字段boolean使用Hibernate 3.6.9版本映射到其Java类中的字段.这迫使我为每个想要获取的实体列表编写一个接口方法:

List<Entity> listEditables();
List<Entity> listReviewNeeded();
List<Entity> listActives();
Run Code Online (Sandbox Code Playgroud)

或者编写一个通用的接口方法来实现它们的组合:

List<Entity> listEntities(boolean editables, boolean reviewNeeded, boolean actives);
Run Code Online (Sandbox Code Playgroud)

第二个选择看起来更大,但是如果我将来添加另一个字段,则需要修改接口本身(以及与之耦合的每一行代码).

所以我决定将它表达为枚举Set:

public enum EntityType{
    EDITABLE, REVIEW_NEEDED, ACTIVE
}

//That way there's no need to change interface method's signature
List<Entity> listEntities(Set<EntityType> requiredTypes);
Run Code Online (Sandbox Code Playgroud)

有意义的是,枚举匹配我想要实现的,Entity类型本身应该有它自己的Set<EntityType>:

public class Entity{
    Set<EntityType> entityTypes;
}
Run Code Online (Sandbox Code Playgroud)

然而,而不是我有映射的布尔值在逻辑上匹配Set.然后我的问题是,有没有办法Set<EntityType> entityTypes在基于BIT字段的hibernate中进行映射,还是我必须自己管理那些逻辑boolean

UPDATE

将它们映射为a Set意味着使用in子句查询List的可能性,如果不是,则意味着在我的控制器和模型代码之间进行转换的额外步骤.

Set<EntityType> typesSet = Sets.newHashSet(EntityType.EDITABLE, EntityType.REVIEW_NEEDED);
//Obtains a list of every single entity which is EDITABLE or REVIEW_NEEDED
session.createCriteria(Entity.class).addRestriction(Restrictions.in("entityTypes",typeSet)).list();
Run Code Online (Sandbox Code Playgroud)

Edu*_*Ros 1

我不认为休眠提供了一种按照您描述的方式管理映射的方法。您可以创建自己的UserTypehttps://community.jboss.org/wiki/Java5EnumUserType),但每次添加新的枚举值时,您都必须更改中的逻辑以UserType映射新字段。

另一种方法是将其转换为一对多关系。您的观点基本上是,如果您想添加更多字段,您将必须更改签名,listEntities而且您还必须修改您的表。

因此,您可以创建一个表,其中包含您的实体类型,并与您的实体具有 @OneToMany` 关系。例如:

根据需要定义您的标志:

public enum Flags {
    EDITABLE, REVIEW_NEEDED, ACTIVE
}
Run Code Online (Sandbox Code Playgroud)

创建一对多关系EntityType

@Entity
@Table( name="entity" )
public class Entity implements Serializable {

    @OneToMany(mappedBy = "entity")
public Set<EntityType> getEntityTypes() {
    return entityTypes;
}
Run Code Online (Sandbox Code Playgroud)

以及多对一Entity

@Entity
@Table( name="entityType" )
public class EntityType implements Serializable {

    @Id
    private Integer id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ENTITY_ID")
    private Entity entity;

    @Enumerated(EnumType.STRING)
    private Flag entityType;

    ...
}
Run Code Online (Sandbox Code Playgroud)

PD:请注意,代码只是一个示例,尚未完成或经过测试。