2013-05-29 10 views
6

Ho questa classe Hibernate con annotazioni:Come creare metriche annotazioni a livello di campo?

@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; 

    ... 
} 

Dal Io non vinto't per annotare ogni id campo delle mie classi in quel modo, ho cercato di creare un anotation personalizzato:

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

in modo che posso usare questa annotazione nella mia classe:

@Entity 
public class SimponsFamily{ 


@EntityId 
private long id; 

    ... 
} 

devo scrivere il @Id e le anteprime @GeneratedValue a livello di campo poiché non supportano la proprietà Retention TYPE. Questa soluzione sembra funzionare.

Le mie domande:

  • Come sono le annotazioni livello di campo nelle mie annotazioni personalizzate (e valori) trasferiti al mio uso di EntityID annotazioni?

  • E i valori predefiniti che ho impostato nella mia annotazione personalizzata, vengono utilizzati poiché non specificherò gli attributi durante l'utilizzo?

  • È un metodo preferibile per utilizzare annotazioni a livello di campo nelle annotazioni?

risposta

4

Penso di poter rispondere alla terza domanda.

Un modo comune di fare ciò che si vuole (evitare la duplicazione di mappatura ID) è quello di creare una superclasse comune che detiene la annotata id e version (per il bloccaggio ottimistico) campi, e poi tutti gli oggetti persistenti estendere questa superclasse. Per garantire che la superclasse non sia considerata un'entità a sé stante, deve essere annotata con @MappedSuperclass.

Ecco un esempio (mi dispiace per errori di battitura, non ho un IDE a portata di mano in questo momento):

@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

La mia speranza era che io possa evitare una superclasse, ma forse questa è la strada da percorrere ... forse la mia domanda è più un problema di annotazione generale piuttosto un problema di ibernazione. Thx comunque! – thilko