Hibernate没有插入DTYPE - 值为null

时间:2013-05-10 11:13:14

标签: hibernate inheritance jpa

我基本上有以下几个类:

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

我希望Hibernate默认使用DTYPE varchar(31)表中存在的列user。当我的代码尝试持久保存新的Admin对象时,我看到以下内容已登录到控制台:

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

因此,Hibernate没有尝试设置user.DTYPE列,并且它在数据库中保持为NULL。我预计它将被设置为Admin

我做错了什么?我还尝试在User类上明确设置@DiscriminatorColumn,在@DiscriminatorValue类上明确设置Admin(并尝试添加到User),但无济于事。

1 个答案:

答案 0 :(得分:4)

使用InheritanceType.JOINED时确实不需要Discriminator列,并且基于this bug report,显然不适用于hibernate注释。

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

关于是否应该支持鉴别列,似乎存在一些混淆和争论,事实上我上面提到的错误被拒绝,因为hibernate团队认为不应该支持它。