Hibernate没有插入DTYPE - 值为null

Ale*_*lex 5 inheritance hibernate 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 */
}
Run Code Online (Sandbox Code Playgroud)

@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 */
}
Run Code Online (Sandbox Code Playgroud)

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

Hibernate: insert into user (email_address) values (?)
Hibernate: insert into admin (role) values (?) 
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?我也曾尝试明确设置@DiscriminatorColumn的用户类@DiscriminatorValueAdmin类(也尝试增加用户一样),但无济于事.

Don*_*oby 5

使用时InheritanceType.JOINED,确实不需要Discriminator列,并且基于此bug报告,显然不适用于休眠注释。

在您的评论中,您说:“因为不能直接实例化任何User对象,所以不需要类型区分符,因为类型会提前知道。” 那是正确的。但主要要点实际上是,对于联合继承,将从数据库中检索到的内容的类型根据其来自哪个表来确定,而不必存储在列中。

关于是否应该支持区分列,似乎存在一些困惑和争论,实际上,我上面提到的错误已被拒绝,因为休眠团队决定不应该支持。