2013-05-29 15 views
6

mam tej klasy hibernacji z adnotacji:Jak tworzyć adnotacje meta na poziomie pola?

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

    ... 
} 

Odkąd Do not won't opisywanie każdego id pole moich klas w ten sposób, starałem się stworzyć niestandardowy adnotację:

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

tak, że mogę korzystać z tej adnotacji w mojej klasie:

@Entity 
public class SimponsFamily{ 


@EntityId 
private long id; 

    ... 
} 

muszę napisać @Id i @GeneratedValue adnotacje na poziomie pola, ponieważ nie obsługują RetentionPolicy TYPE. Te rozwiązania wydają się działać.

Moje pytania:

  • Jak adnotacje szczeblu terenowym w moich własnych adnotacji (i wartości) przeniesiona do mojego użytkowania identyfikator podmiotu adnotacji?

  • Co z wartościami domyślnymi, które ustawiam w mojej adnotacji niestandardowej, czy są one używane, ponieważ nie określam atrybutów podczas użytkowania?

  • Jest to preferowany sposób korzystania z adnotacji na poziomie pola w adnotacjach?

Odpowiedz

4

Myślę, że mogę odpowiedzieć na twoje trzecie pytanie.

Jeden wspólny sposób, aby robić to, co chcesz (unikać duplikowania mapowanie ID) jest stworzenie wspólnego superklasę że trzyma uwagami id i version (dla optymistycznych blokujących) pól, a następnie mieć wszystkie trwałe obiekty przedłużyć ten superklasę. Aby zapewnić, że nadklasa nie jest sama uważana za Podmiot, musi być opatrzona przypisami z @MappedSuperclass.

Oto przykład (przepraszam za literówki, nie mam pod ręką IDE teraz):

@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

Mam nadzieję, że mogę uniknąć superklasę, ale może to jest droga ... może moje pytanie to raczej ogólny problem z adnotacjami, a raczej problem z hibernacją. Thx i tak! – thilko

Powiązane problemy