views:

1449

answers:

5

In my MySQL database, there's the column "gender enum('male','female')"

I've created my enum "com.mydomain.myapp.enums.Gender", and in my Person entity I'm defined "Gender gender".

Now I'd want to keep the enum type in my MySQL database, but when I launch my application I get:

Wrong column type in MyApp.Person for column Gender. Found: enum, expected: integer

Why is this? This would be the equivalent as if I'd annotated my "Gender gender" with "@Enumerated(EnumType.ORDINAL)", which I haven't. EnumType seems only to be able to be either ORDINAL or STRING, so how do I specify that it should treat the field as an enum, not as an int? (not that there's much difference, but enough for it to get upset about it.)

A: 

Here is an example how you can define a UserType for persisting an Enum with a VARCHAR column

Using annotations: http://blog.richardadamdean.com/?p=129

stacker
I'm sorry if I didn't write it very clearly, but I want to persist my Enum as an Enum. I don't want it persisted as a varchar or an integer. Also, I'm looking for a solution that uses annotations, not mapping files
niklassaers
Then this may work better: @Enumerated(EnumType.ORDINAL)
stacker
+2  A: 

My understanding is that MySQL enum type is very proprietary and not well supported by Hibernate, see this comment from Gavin King (this related issue is a bit different but that's not the important part).

So, I actually think that you'll have to use your own UsereType and I'd recommend to use the Flexible solution - working version from the Java 5 EnumUserType (see Appfuse's Java 5 Enums Persistence with Hibernate for an example).

Personally, I'd just forget the idea to use MySQL enum, I'm not convinced that the "benefits" are worth it (see this answer for more details).

Pascal Thivent
A: 

Try to use @Enumerated(EnumType.STRING) and define your enum like this

enum Gender {
  male,
  female
}

Note lower case values.

This will work at least with VARCHAR columns. It will store enum as string 'male' or 'female'.

Juha Syrjälä
As written, I'm using enum type column, not varchar
niklassaers
Have you actually tried my suggestion? gender type in mysql is probably just some wrapping/syntactic sugar around a varchar or char column.
Juha Syrjälä
A: 

Make just one character length constants and that's it. See this blog post.

@Column(nullable = false, columnDefinition = "char(1) default 'A'")
@Enumerated(EnumType.STRING)
private FruitType fruit_type = FruitType.A;


public enum FruitType {
  /** Apples */
  A,
  /** Apricots */
  B,
  /** Cherries */
  C,
  /** Pears */
  P;
}
xmedeko
A: 

If you give Hibernate a column definition, it won't try to guess one:

@Column(columnDefinition = "enum('MALE','FEMALE')")
@Enumerated(EnumType.STRING)
private Gender gender;

If you aren't relying on Hibernate to generate your schema for any reason, you don't even have to provide real values for the columnDefinition. This way, you remove an instance where you need to keep the values in sync. Just keep your Java enum and your Liquibase or SQL script in sync:

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;
Jimmie Fulton