2010-08-03 6 views
5

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

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

  • новый
  • рассылаемые
  • в
  • из

И колонка отображенные следующим образом:

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

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

Если у меня есть континуальные континуумы ​​NEW, MAILED, IN и OUT hibernate завершается с ошибкой, так как внутри EnumType он имеет значение Enum.valueOf().

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

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

Мои Enum, как это:

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

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

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

Это не будет компилироваться как «новые» является Java зарезервированного слова.

ответ

2

Если вы можете использовать оператор SQL ВЕРХНЕЙ в базе данных, он будет работать без использования какого-либо 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())); 
    } 

}

+0

Я предполагаю, что вы хотите изменить данные в базе данных? Что-то вроде обновления TABLE set status = upper (status). Я не могу этого сделать, так как он нарушит существующие приложения, которые говорят с этими данными, ожидая его как строчного значения. – stevemac

+0

@stevemac Обновлено –

+0

Это то, что я разработал в конце, базовое хранение строки внутри и отображение ее из/в перечисление при вызове get/set. Это нужно сделать в краткосрочной перспективе, пока я не смогу обновить все приложения, чтобы использовать прописные константы. – stevemac

1

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

+1

именно эта проблема, но я не могу иметь ае num со значением new в нижнем регистре, поскольку это зарезервированное слово в java. – stevemac

Смежные вопросы