2013-05-10 10 views
5

Mam zasadniczo następujące klasy:hibernacji nie wkładając dtype - wartość jest null

@Entity 
@Table(name="user") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class User implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "email_address") 
    private String emailAddress; 

    /* getters and setters not shown */ 
} 

i

@Entity 
@Table(name="admin") 
public class Admin extends User implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Column(name = "role") 
    private String role; 

    /* getters and setters not shown */ 
} 

Spodziewam hibernacji używać domyślnie kolumnowej DTYPE varchar(31) która istnieje w tabeli user. Kiedy mój kod stara się utrzymywać nowego administratora obiektu zobaczę następujący zalogowany do konsoli:

Hibernate: insert into user (email_address) values (?) 
Hibernate: insert into admin (role) values (?) 

Zatem nie próbuje się przez Hibernate ustawić kolumnę user.DTYPE i pozostaje NULL w bazie danych. Spodziewałem się, że zostanie ustawiony na Admin.

Co robię źle? Próbowałem również jawnie ustawić @DiscriminatorColumn na klasie użytkownika i @DiscriminatorValue na klasie Admin (i próbowałem również dodawać do użytkownika), ale bez skutku.

+0

Zamieszczam tutaj, ponieważ nie mogę odpowiedzieć na moje własne pytanie przez 8 godzin po wysłaniu: Po pomyśleniu trochę więcej: Wierzę, że dzieje się tak dlatego, że 'Użytkownik' jest abstrakcyjny. Ponieważ nie można bezpośrednio utworzyć instancji obiektu użytkownika, nie ma potrzeby stosowania dyskryminatora typu, ponieważ typ będzie znany z wyprzedzeniem. Ktoś dał mi znać, jeśli się mylę! – Alex

Odpowiedz

4

Kolumna Discriminator naprawdę nie jest potrzebna podczas korzystania z InheritanceType.JOINED i oparta na this bug report, najwyraźniej nie działa z adnotacjami hibernacji.

W swoim komentarzu mówisz "Ponieważ żaden obiekt użytkownika nie może być tworzony bezpośrednio, nie ma potrzeby stosowania dyskryminatora typu, ponieważ typ będzie znany z wyprzedzeniem." i to jest w porządku. Ale głównym punktem jest to, że w przypadku dziedziczenia połączonego typ czegoś pobranego z bazy danych jest ustalany na podstawie tabeli, z której pochodzi i nie musi być przechowywany w kolumnie.

Wydaje się, że istnieje pewne zamieszanie i dyskusja, czy kolumny dyskryminujące powinny być obsługiwane, a błąd, który zauważyłem powyżej, został odrzucony, ponieważ zespół hibernacji zdecydował, że nie powinien być obsługiwany.

Powiązane problemy