2013-05-10 60 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注释。

在您的评论中,您说“因为没有用户对象可以直接实例化,所以不需要类型鉴别器,因为类型将提前知道。”这是对的。但最重要的一点是,对于连接继承,从数据库中检索的东西的类型是根据它来自哪个表来计算出来的,并且不必存储在列中。

似乎有一些混乱和辩论,以鉴别是否列应支持,而事实上我上面提到的错误是拒绝,作为休眠小组决定它不应该被支持。