2013-05-10 14 views
5

ho essenzialmente le seguenti classi:Hibernate non inserendo DTYPE - valore è nullo

@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 */ 
} 

e

@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 */ 
} 

mi aspetto Sospensione utilizzare per impostazione predefinita una colonna DTYPE varchar(31) che esiste nella tabella user. Quando il mio codice tenta di persistere un nuovo oggetto Admin compaiono i seguenti registrati per console:

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

Quindi nessun tentativo è fatta da Hibernate per impostare la colonna user.DTYPE, e rimane NULL nel database. Mi aspettavo che sarebbe stato impostato su Admin.

Cosa sto sbagliando? Ho anche provato a impostare in modo esplicito @DiscriminatorColumn sulla classe User e @DiscriminatorValue sulla classe Admin (e ho anche provato ad aggiungerlo a Utente) ma senza successo.

+0

Pubblicare qui poiché non posso rispondere alla mia stessa domanda per 8 ore dopo la pubblicazione: Dopo aver pensato un po 'di più: credo che questo sia dovuto al fatto che 'User' è astratto. Poiché nessun oggetto User' può essere istanziato direttamente, non è necessario un discriminatore di tipo, poiché il tipo sarà conosciuto in anticipo. Qualcuno mi faccia sapere se mi sbaglio! – Alex

risposta

4

Una colonna Discriminatore non è realmente necessaria quando si utilizza InheritanceType.JOINED e in base a this bug report, apparentemente non funziona con le annotazioni di ibernazione.

Nel tuo commento, dici "Perché nessun oggetto Utente può essere istanziato direttamente, non è necessario un discriminatore di tipo, poiché il tipo sarà conosciuto in anticipo." e questo è un po 'giusto. Ma il punto principale è che per l'ereditarietà unita, il tipo di qualcosa recuperato dal DB viene calcolato in base alla tabella da cui proviene e non deve essere memorizzato in una colonna.

Sembra che ci sia una certa confusione e il dibattito sul fatto che le colonne discriminatore dovrebbero essere sostenuti, e in effetti il ​​bug ho già detto è stato respinto , come la squadra di ibernazione deciso che non dovrebbe essere sostenuto.

Problemi correlati