我有一个实体,它在数据库中有一些BIT字段:
这些字段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)
我不认为休眠提供了一种按照您描述的方式管理映射的方法。您可以创建自己的UserType(https://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:请注意,代码只是一个示例,尚未完成或经过测试。
| 归档时间: |
|
| 查看次数: |
1931 次 |
| 最近记录: |