简体   繁体   中英

Hibernate Enum mapping using annotaions

I have an existing database that I am now connecting to using hibernate. I cannot change the data in it at the moment and have everything working apart from a single column.

I have a status column that has the values:

  • new
  • mailed
  • in
  • out

And the column is mapped as follows:

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

I would REALLY like (for application reasons) to have this column mapped as a Java Enum (TeamMemberStatus), but due to the fact that 'new' is a keyword in Java I cannot have that as an enum member.

If I have the enum contstants NEW, MAILED, IN and OUT hibernate fails as inside EnumType it does a Enum.valueOf().

Is there any way for me to map this to my Enum without having to write a complex UserType?

-- added content

My Enum like this:

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

is a valid Java enum, but not matching the case of the database. If I change it to match the database like:

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

It won't compile as 'new' is a Java reserved word.

If you can use a SQL UPPER statement at database, It will work without using any UserType

UPDATE

Well, It can not be The nicest solution but it solves what you want

@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()));
   }

}

If your Database values are "new", "mailed", "in" and "out" then your Enum need exactly the same names. - I believe that the problem is, that your Enums are in capital letters but your data base values not.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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