[英]Hibernate Mapping: Class having more than one possible value from an enum
我正在做一个简单的网页,并且我有一个NurseForm
实体。 当护士看病人时,他/她填写此表格。
此表单字段之一是“操作已完成”,基本上是一个包含以下内容的枚举:
public enum NurseAction {
GIVE_MEDICINE, PERFORM_SUTURE, SPRAY_THERAPY, NEBULIZATIONS;
}
护士可以执行多个动作,所以我有一个属性:
private Collection<NurseAction> nurseActions;
据我了解,我需要NurseAction
成为实体,但是如果这样做,我应该手工填充数据库。
我可以避免吗? 哪个是解决此问题的最佳方法?
PS:我是Hibernate
新手。
您可以尝试使用@CollectionOfElements(targetElement=NurseAction.class)
(可以尝试忽略属性,让休眠基于集合的type参数来假定它)
请注意,此注释在hibernate 3.5中已弃用,而与JPA 2.0中的注释相同。
不幸的是,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;
}
}
免责声明:所有这些未经测试,甚至未经编译。 另外,我喜欢Google番石榴,因为我喜欢它。 :)
祝好运!
在任何操作只能应用于患者一次的假设下,我建议使用Set
而不是Collection
。 如果这不符合您的要求,请纠正我。 如果set语义可以,我建议使用EnumSet
来存储操作。 它非常快速且符合Set
实现。 它在后台使用单个long
值(只要您的动作少于64个)。
现在,我的解决方案是使用自定义UserType
将单个数字列存储到数据库,该UserType
从EnumSet
映射到long
,反之亦然。
优点
缺点
如果要查看此类UserType
的通用抽象可重用实现,请查看http://source.palava2.org/browse/commons.svn.cosmocode.de/cosmocode-hibernate/trunk/src/主/ JAVA / DE / cosmocode /休眠/ EnumSetUserType.java R = HEAD
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.