Отображение Hibernate Enum с использованием аннотаций - PullRequest
5 голосов
/ 03 августа 2010

У меня есть существующая база данных, к которой я сейчас подключаюсь, используя hibernate.Я не могу изменить данные в нем в данный момент и у меня все работает, кроме одного столбца.

У меня есть столбец состояния, который имеет значения:

  • new
  • отправлено
  • в
  • out

И столбец отображается следующим образом:

@Column(name = "STATUS", nullable = false, length = 50)
@Enumerated(EnumType.STRING)
private TeamMemberStatus status;

Я бы ДЕЙСТВИТЕЛЬНО хотел (для приложенияпричины), чтобы этот столбец отображался как Enum Java (TeamMemberStatus), , но из-за того, что 'new' является ключевым словом в Java , я не могу иметь это как член перечисления.

Если у меня есть константы enum NEW, MAILED, IN и OUT в спящем режиме гибернации, то как внутри EnumType это делает Enum.valueOf ().

Есть ли способ для меня сопоставить это с моим Enum без необходимости писатьcomplex UserType?

- добавлено содержимое

My Enum примерно так:

public enum TeamMemberStatus {
    NEW, MAILED, IN, OUT 
}

является допустимым перечислением Java, но не соответствует регистру базы данных.Если я изменю его, чтобы он соответствовал базе данных, например:

public enum TeamMemberStatus {
    new, mailed, in, out
}

Он не скомпилируется, поскольку 'new' - это зарезервированное слово Java.

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Если вы можете использовать оператор SQL UPPER в базе данных, он будет работать без использования UserType

UPDATE

Ну, это не может быть самое хорошее решение, но оно решает, что вы хотите

@Entity
public class WrapperEntity {

   private TeamMemberStatus memberStatus;

   @Transient
   private TeamMemberStatus getMemberStatus() {
       return this.memberStatus;
   }

   public void setMemberStatus(TeamMemberStatus memberStatus) {
       this.memberStatus = memberStatus;
   }

   @Column(name="STATUS", nullable=false, length=50)
   public String getMemberStatusAsString() {
       return memberStatus.name().toLowerCase();
   }

   public void setMemberStatusAsString(String memberStatus) {
       this.setsetMemberStatus(TeamMemberStatus.valueOf(memberStatus.toUpperCase()));
   }

}

1 голос
/ 03 августа 2010

Если значения вашей базы данных "new", "mailed", "in" и "out", то вашему Enum нужны точно такие же имена. - Я считаю, что проблема в том, что ваши Enums написаны заглавными буквами, а значения вашей базы данных - нет.

...