繁体   English   中英

休眠映射:类具有一个枚举中多个可能的值

[英]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将单个数字列存储到数据库,该UserTypeEnumSet映射到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM