Hibernate Mapping: класс, имеющий более одного возможного значения из перечисления - PullRequest
2 голосов
/ 04 сентября 2010

Я делаю простую веб-страницу, и у меня есть NurseForm сущность.Когда медсестра видит пациента, он / она заполняет эту форму.

Одним из полей этой формы является «Действия выполнены», в основном это перечисление:

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

Медсестра может выполнить большечем одно действие, поэтому у меня есть свойство:

private Collection<NurseAction> nurseActions;

Из того, что я понимаю, мне нужно NurseAction, чтобы быть сущностью, но если я сделаю это, я должен заполнить БД вручную.Могу ли я избежать этого?Какой лучший способ решить эту проблему?

PS: я новичок в Hibernate.

Ответы [ 3 ]

2 голосов
/ 04 сентября 2010

Вы можете попробовать использовать @CollectionOfElements(targetElement=NurseAction.class) (вы можете попытаться опустить атрибут и позволить hibernate принять его на основе параметра типа коллекции)

Обратите внимание, что эта аннотация устарелав hibernate 3.5, в пользу той же аннотации от JPA 2.0.

1 голос
/ 05 сентября 2010

В предположении, что любое действие может быть применено к пациенту только один раз, я бы предложил использовать Set вместо Collection. Пожалуйста, поправьте меня, если это не соответствует вашим требованиям. В случае, если установлен 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

1 голос
/ 04 сентября 2010

К сожалению, Hibernate (пока) не поддерживает коллекции Enums должным образом.Но не думаете ли вы, что новые действия, скорее всего, будут добавлены позже?Я бы порекомендовал обратиться к Entity за действием, чтобы убедиться, что вам не нужно повторно развертывать все ваше приложение только потому, что вы добавляете действие ...

Конечно, вы всегда можете что-то сделать(некрасиво :) вот так:

@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, потому что мне это нравится.:)

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...