Hibernate 不插入 DTYPE - 值为空

标签 hibernate inheritance jpa

我基本上有以下类(class):

@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 中 table 。当我的代码尝试保留一个新的 Admin 对象时,我看到以下记录到控制台:
Hibernate: insert into user (email_address) values (?)
Hibernate: insert into admin (role) values (?) 

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

我究竟做错了什么?我也试过明确设置 @DiscriminatorColumn在 User 类和 @DiscriminatorValue 上在 Admin类(也尝试添加到 User 中)但无济于事。

最佳答案

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

在您的评论中,您说“因为没有 User 对象可以直接实例化,所以不需要类型鉴别器,因为类型会提前知道。”这是正确的。但主要的一点是,对于联合继承,从数据库中检索到的东西的类型是根据它来自哪个表来确定的,而不必存储在列中。

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

关于Hibernate 不插入 DTYPE - 值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16480996/

相关文章:

java - 使用 JPA 和 Spring Boot 从数据库获取数据而不使用实体或 POJO 类?

c++ - 友元函数中指向基类参数类型的指针

java - 为什么不能从父类中实现的接口(interface)对象调用子类方法

java - Spring JPA 选择特定列

spring-boot - 是否可以将 Snowflake 与 Spring Boot/JPA/Hibernate 一起使用

java - 错误 4956 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-00923: FROM keyword not found where expected

java - @Column columnDefinition 使哪些属性变得多余?

c# - 从基类访问继承的类属性

java - OneToMany 更新在子类中不起作用

java - 无法从 Spring Boot 连接到 MySQL 数据库