mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
91 lines
2.7 KiB
Java
91 lines
2.7 KiB
Java
package com.avaje.ebean.annotation;
|
|
|
|
import java.lang.annotation.ElementType;
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
import java.lang.annotation.Target;
|
|
|
|
/**
|
|
* For mapping the values of an Enum to and from Database values.
|
|
* <p>
|
|
* Also refer to the {@link EnumValue} approach which probably the preferred now
|
|
* (preferred over using this EnumMapping annotation).
|
|
* </p>
|
|
* <p>
|
|
* Both of the approaches defined in the JPA have significant problems!!!
|
|
* </p>
|
|
* <p>
|
|
* Using the ordinal value is VERY RISKY because that depends on the compile
|
|
* order of the enum values. Aka if you change the order of the enum values you
|
|
* have changed their ordinal values and now your DB values are WRONG - a HUGE
|
|
* disaster!!!.
|
|
* </p>
|
|
* <p>
|
|
* Using the String values of enums is fairly restrictive because in a Database
|
|
* these values are usually truncated into short codes (e.g. "A" short for
|
|
* "ACTIVE") so space used in the database is minimised. Making your enum names
|
|
* match the database values would give them very short less meaningful names -
|
|
* not a great solution.
|
|
* </p>
|
|
* <p>
|
|
* You can use this annotation to control the mapping of your enums to database
|
|
* values.
|
|
* </p>
|
|
* <p>
|
|
* The design of this using nameValuePairs is not optimal for safety or
|
|
* refactoring so if you have a better solution I'm all ears. The other
|
|
* solutions would probably involve modifying each enumeration with a method
|
|
* which may be ok.
|
|
* </p>
|
|
* <p>
|
|
* An example mapping the UserState enum.
|
|
* </p>
|
|
*
|
|
* <pre class="code">
|
|
* ...
|
|
* @EnumMapping(nameValuePairs="NEW=N, ACTIVE=A, INACTIVE=I")
|
|
* public enum UserState {
|
|
* NEW,
|
|
* ACTIVE,
|
|
* INACTIVE;
|
|
* }
|
|
* </pre>
|
|
*
|
|
* @see EnumValue
|
|
*/
|
|
@Target({ ElementType.TYPE })
|
|
@Retention(RetentionPolicy.RUNTIME)
|
|
public @interface EnumMapping {
|
|
|
|
/**
|
|
* A comma delimited list of name=value pairs.
|
|
* <p>
|
|
* e.g. "ACTIVE=A, INACTIVE=I, NEW=N".
|
|
* </p>
|
|
* <p>
|
|
* Where ACTIVE, INACTIVE and NEW are the enumeration values and "A", "I" and
|
|
* "N" are the database values.
|
|
* </p>
|
|
* <p>
|
|
* This is not really an optimal approach so if you have a better one I'm all
|
|
* ears - thanks.
|
|
* </p>
|
|
*/
|
|
String nameValuePairs();
|
|
|
|
/**
|
|
* Defaults to mapping values to database VARCHAR type. If this is set to true
|
|
* then the values will be converted to INTEGER and mapped to the database
|
|
* integer type.
|
|
* <p>
|
|
* e.g. "ACTIVE=1, INACTIVE=0, NEW=2".
|
|
* </p>
|
|
*/
|
|
boolean integerType() default false;
|
|
|
|
/**
|
|
* The length of DB column if mapping to string values.
|
|
*/
|
|
int length() default 0;
|
|
};
|