001package io.ebean.annotation;
002
003import java.lang.annotation.ElementType;
004import java.lang.annotation.Retention;
005import java.lang.annotation.RetentionPolicy;
006import java.lang.annotation.Target;
007
008/**
009 * Specify a method on an Enum that returns the value that should be stored in the DB.
010 * <p>
011 * This is the preferred option for mapping Enum's to DB values (preferred over the JPA
012 * standard @Enumerated and Ebean's @EnumValue annotations).
013 * </p>
014 * <h3>Example:</h3>
015 * <pre>{@code
016 *
017 *   public enum Status {
018 *     NEW("N"),
019 *     ACTIVE("A"),
020 *     INACTIVE("I");
021 *
022 *     String dbValue;
023 *     Status(String dbValue) {
024 *       this.dbValue = dbValue;
025 *     }
026 *
027 *     @DbEnumValue
028 *     public String getValue() {
029 *       return dbValue;
030 *     }
031 *   }
032 *
033 * }</pre>
034 */
035@Retention(RetentionPolicy.RUNTIME)
036@Target(ElementType.METHOD)
037public @interface DbEnumValue {
038
039  /**
040   * Specify the database type used to store the values (VARCHAR or INTEGER).
041   */
042  DbEnumType storage() default DbEnumType.VARCHAR;
043
044  /**
045   * The column length for VARCHAR.
046   * <p>
047   * When 0 the length is determined automatically based on the maximum length of the values used.
048   * <p>
049   * Specify this to allow for future string enum values that might be larger then the automatically
050   * determined maximum length.
051   */
052  int length() default 0;
053
054}