Hibernate Mapping:具有枚举中多个可能值的类

时间:2010-09-04 19:06:18

标签: java hibernate enums

我正在做一个简单的网页,我有一个NurseForm实体。当护士看病人时,他/她会填写此表格。

此表单字段之一是“已完成操作”,它基本上是一个枚举:

public enum NurseAction {
    GIVE_MEDICINE, PERFORM_SUTURE, SPRAY_THERAPY, NEBULIZATIONS;
}

护士可以执行多项操作,因此我有一个属性:

private Collection<NurseAction> nurseActions;

根据我的理解,我需要NurseAction成为一个实体,但如果我这样做,我应该手动填充数据库。

我可以避免吗?哪种解决方法最好?

PS:我是Hibernate的完全新手。

3 个答案:

答案 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