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.
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