2010-05-28 21 views
7

Próbuję zrozumieć, jak najlepiej zaimplementować polimorficzny jeden-do-wielu w stanie hibernacji.Hibernate - Trwałe połączenia polimorficzne

Np

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

A teraz chciałbym również utrzymują informacje z kontroli, z następujących klas:

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

Co jest właściwe odwzorowanie dla auditEvent.entity? Również, w jaki sposób Hibernate faktycznie to wytrzymuje? Czy wygenerowany zostanie szereg tabel łączenia (AuditEvent_Author, AuditEvent_Post, AuditEvent_Comment), czy jest lepszy sposób?

Uwaga, wolałbym, aby moje pozostałe klasy encji nie ujawniały drugiej strony łączenia (np., List<AuditEvent> events na BaseEntity) - ale jeśli jest to najczystszy sposób implementacji, wystarczy.

Odpowiedz

4

Mapowana superklasa nie jest jednostką i dlatego nie może być częścią skojarzenia (jak przypomniał w EJB-199). Więc albo:

  • dokonać BaseEntity abstrakcyjne i stosować strategię TABLE_PER_CLASS (zobacz previous answer)
  • przedstawić kolejną AuditableEntitypodmiot w hierarchii i wykorzystać to, co byłoby najbardziej appropriate inheritance strategy dla przypadku użycia.
  • za pomocą Envers