我正在做一个简单的网页,我有一个NurseForm
实体。当护士看病人时,他/她会填写此表格。
此表单字段之一是“已完成操作”,它基本上是一个枚举:
public enum NurseAction {
GIVE_MEDICINE, PERFORM_SUTURE, SPRAY_THERAPY, NEBULIZATIONS;
}
护士可以执行多项操作,因此我有一个属性:
private Collection<NurseAction> nurseActions;
根据我的理解,我需要NurseAction
成为一个实体,但如果我这样做,我应该手动填充数据库。
我可以避免吗?哪种解决方法最好?
PS:我是Hibernate
的完全新手。
答案 0 :(得分:2)
您可以尝试使用@CollectionOfElements(targetElement=NurseAction.class)
(您可以尝试省略该属性,让hibernate根据集合的类型参数假设它)
请注意,在hibernate 3.5中不推荐使用此注释,而是支持JPA 2.0中的相同注释。
答案 1 :(得分:1)
不幸的是,Hibernate还没有(还)正确支持Enums集合。但是你不认为以后很可能会添加新的行动吗?我建议您选择一个实体进行操作,以确保您不必因为添加操作而重新部署整个应用...
当然,你也可以像这样做一些事(丑陋:):
@Entity public class NurseForm {
private String actions;
public void setActions(final List<NurseAction> actions) {
if(actions == null)
this.actions = null;
else
this.actions = Joiner.on(',').join(actions);
}
public List<NurseAction> getActions() {
List<NurseAction> returner = Lists.newArrayList();
if(this.actions != null) {
Iterable<String> actions = Splitter.on(',').split(this.actions);
for(String action : actions)
returner.add(NurseAction.valueOf(action);
}
return returner;
}
}
免责声明:所有这些都是未经测试的,甚至是未编译的。此外,我正在大量使用谷歌番石榴,因为我喜欢它。 :)
祝你好运!答案 2 :(得分:1)
假设任何行动可能只对患者施加一次,我建议使用Set
代替Collection
。如果这不符合您的要求,请纠正我。如果set semantic正常,我建议使用EnumSet
来存储动作。它非常快速且符合Set
的实施要求。它使用了一个long
值(只要你有少于64个动作)。
现在我的解决方案是使用自定义UserType
将单个数字列存储到数据库,自定义EnumSet
映射到long
,反之亦然。
赞成
缺点
如果您想查看此类UserType
的通用抽象可重用实现,请查看http://source.palava2.org/browse/commons.svn.cosmocode.de/cosmocode-hibernate/trunk/src/main/java/de/cosmocode/hibernate/EnumSetUserType.java?r=HEAD