2013-05-29 7 views
6

Ich habe diese Hibernate Klasse mit Anmerkungen:Wie erstelle ich Meta-Annotationen auf Feldebene?

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

    ... 
} 

Da wird ich nicht dont jedes id Feld meiner Klassen auf diese Weise zu annotieren, habe ich versucht, einen benutzerdefinierten den Vermerk zu erstellen:

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

, so dass ich diese Anmerkung in meiner Klasse verwenden:

@Entity 
public class SimponsFamily{ 


@EntityId 
private long id; 

    ... 
} 

ich schreibe, um die @Id und die @GeneratedValue Annotationen auf Feldebene, da sie die TYPE RetentionPolicy nicht unterstützen. Diese Lösung scheint zu funktionieren.

Meine Fragen:

  • Wie die Feldebene Anmerkungen in meinen benutzerdefinierten Anmerkungen werden (und Werte) meine Nutzung von EntityID Anmerkung übertragen?

  • Was ist mit den Standardwerten, die ich in meiner benutzerdefinierten Annotation eingestellt habe, werden sie verwendet, da ich bei der Verwendung keine Attribute festlege?

  • Es ist eine bevorzugte Möglichkeit, Annotationen auf Feldebene in Annotationen zu verwenden?

Antwort

4

Ich denke, ich kann Ihre dritte Frage beantworten.

Eine übliche Art und Weise zu tun, was Sie wollen (vermeiden ID-Mapping-Duplizierung) ist eine gemeinsame übergeordnete Klasse zu erstellen, die das kommentierte id und version (für die optimistische Sperren) Felder halten, und dann hat alle persistenten Objekte diese übergeordnete Klasse erweitern. Um sicherzustellen, dass die Superklasse nicht als eigenständige Entität betrachtet wird, muss sie mit @MappedSuperclass kommentiert werden. Hier

ist eine Probe (sorry für Fehler, ich habe nicht ein IDE zur Hand habe jetzt):

@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

Meine Hoffnung war, dass ich ein Super vermeiden kann, aber vielleicht ist dies der Weg zu gehen ... vielleicht ist meine Frage eher ein generelles Annotationsproblem als ein Winterschlafproblem. Thx sowieso! – thilko