2013-05-29 3 views
6

У меня есть этот спящий класс с аннотациями:Как создать мета-аннотации на уровне поля?

@Entity 
public class SimponsFamily{ 

    @Id 
    @TableGenerator(name = ENTITY_ID_GENERATOR, 
       table = ENTITY_ID_GENERATOR_TABLE, 
       pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME, 
       valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR) 
    private long id; 

    ... 
} 

Поскольку Я не won't аннотировать каждый ID поле моих классов, кстати, я пытался создать пользовательскую заметку:

@TableGenerator(name = ENTITY_ID_GENERATOR, 
      table = ENTITY_ID_GENERATOR_TABLE, 
      pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME, 
      valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME) 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface EntityId { 

    @GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR) 
    public int generator() default 0; 

    @Id 
    public long id() default 0; 
} 

так, что я могу использовать эту аннотацию в моем классе:

@Entity 
public class SimponsFamily{ 


@EntityId 
private long id; 

    ... 
} 

Я должен написать @Id и анкеты @GeneratedValue на уровне поля, так как они не поддерживают TYPE RetentionPolicy. Эти решения, похоже, работают.

Мои вопросы:

  • Как аннотации на уровне полей в моих пользовательских аннотаций (и значения) переданы моему использованию EntityId аннотацию?

  • Как насчет значений по умолчанию, которые я установил в своей пользовательской аннотации, используются ли они, поскольку я не указываю атрибуты при использовании?

  • Это предпочтительный способ использования аннотаций на уровне поля в аннотациях?

ответ

4

Я думаю, что могу ответить на третий вопрос.

Один из распространенных способов сделать то, что вы хотите (во избежание дублирования ID отображение) является создание общего суперкласса, который держит аннотированный id и version (для оптимистической блокировки) полей, а затем все постоянные объекты продлить этот суперкласс. Чтобы гарантировать, что суперкласс не считается сущностью самостоятельно, он должен быть аннотирован @MappedSuperclass.

Вот пример (извините за опечатки, я не есть IDE под рукой прямо сейчас):

@MappedSuperclass 
public class PersistentObject { 

    @Id // Put all your ID mapping here 
    private Long id; 

    @Version 
    private Long version; 

} 

@Entity 
public class SimpsonsFamily extends PersistentObject {   
    // Other SimpsonFamily-specific fields here, with their mappings  
} 
+0

Моя надежда была, что я могу избежать суперкласс, но, возможно, это путь ... возможно, мой вопрос - скорее общая проблема с аннотацией, а проблема спящего режима. Thx в любом случае! – thilko

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