2010-05-28 11 views
7

Estoy tratando de comprender cómo implementar mejor un uno-a-uno polimórfico en hibernación.Hibernate: polimórficos persistentes se une a

Ej:

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

Y ahora, me gustaría que persista también información de auditoría, con la siguiente clase:

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

¿Cuál es la asignación apropiada para auditEvent.entity? Además, ¿cómo Hibernate realmente persistirá? ¿Se generaría una serie de tablas de unión (AuditEvent_Author, AuditEvent_Post, AuditEvent_Comment), o hay una forma mejor?

Nota: Prefiero que mis otras clases de entidad no expongan el otro lado de la unión (p. Ej., List<AuditEvent> events en BaseEntity), pero si esa es la forma más limpia de implementarla, será suficiente.

Respuesta

4

Una superclase mapeada no es una entidad y, por lo tanto, no puede formar parte de una asociación (como se recuerda en EJB-199). Así que o bien:

  • elaborar un resumen que BaseEntity y utilizar una estrategia TABLE_PER_CLASS (ver este previous answer)
  • introducir otro AuditableEntityentidad en la jerarquía y el uso de lo que sería el más appropriate inheritance strategy para su caso de uso.
  • considere usar Envers