2010-05-28 17 views
7

Sto cercando di capire come implementare al meglio uno polimorfico one-to-many in modalità ibernazione.Ibernazione: unione polimorfica persistente

Esempio:

@MappedSuperclass 
public class BaseEntity { 
    Integer id; 
    // etc... 
} 

@Entity 
public class Author extends BaseEntity {} 

@Entity 
public class Post extends BaseEntity {} 

@Entity 
public class Comment extends BaseEntity {} 

E ora, mi piacerebbe a persistere anche informazioni di controllo, con la seguente classe:

@Entity 
public class AuditEvent { 
    @ManyToOne // ? 
    BaseEntity entity; 
} 

Qual è la mappatura appropriata per auditEvent.entity? Inoltre, come andrà Hibernate a persistere? Verrà generata una serie di tabelle di join (AuditEvent_Author, AuditEvent_Post, AuditEvent_Comment) o c'è un modo migliore?

Nota, preferirei che le altre classi di entità non espongano l'altro lato del join (ad esempio, List<AuditEvent> events su BaseEntity), ma se questo è il modo più semplice per implementare, sarà sufficiente.

risposta

4

Una superclasse mappata non è un'entità e quindi non può essere parte di un'associazione (come ricordato in EJB-199). Quindi, o:

  • rendere il vostro BaseEntity astratto e utilizzare una strategia TABLE_PER_CLASS (si veda questo previous answer)
  • introdurre un altro AuditableEntityentità nella gerarchia e utilizzare quello che sarebbe il più appropriate inheritance strategy per il vostro caso d'uso.
  • considerare l'utilizzo di Envers