2013-05-10 48 views
5

我有實質上包含以下類別:休眠不插入DTYPE - 值爲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 */ 
} 

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

我希望休眠默認其存在於user表中的列DTYPE varchar(31)使用。當我的代碼試圖堅持一個新的管理對象我看到以下記錄到控制檯:

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

因此沒有嘗試在Hibernate設置user.DTYPE列,並在數據庫中保持爲空。我預計它將被設置爲Admin

我在做什麼錯?我也嘗試在用戶類中明確設置@DiscriminatorColumn,並在Admin類中嘗試設置@DiscriminatorValue(並且也嘗試向用戶添加),但無濟於事。

+0

由於我無法在發佈後8小時內回答自己的問題,所以在此發帖:思考一些後:我相信這是因爲'User'是抽象的。因爲沒有'User'對象可以直接實例化,所以不需要類型鑑別器,因爲類型將提前知道。有人告訴我,如果我錯了! – Alex 2013-05-10 12:16:45

回答

4

使用InheritanceType.JOINED時根本不需要Discriminator列,並且基於this bug report,顯然不支持hibernate註釋。

在您的評論中,您說「因爲沒有用戶對象可以直接實例化,所以不需要類型鑑別器,因爲類型將提前知道。」這是對的。但最重要的一點是,對於連接繼承,從數據庫中檢索的東西的類型是根據它來自哪個表來計算出來的,並且不必存儲在列中。

似乎有一些混亂和辯論,以鑑別是否列應支持,而事實上我上面提到的錯誤是拒絕,作爲休眠小組決定它不應該被支持。