【问题标题】:Hibernate not inserting DTYPE - value is null休眠不插入 DTYPE - 值为空
【发布时间】:2013-05-10 11:13:13
【问题描述】:

我基本上有以下课程:

@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 默认使用存在于 user 表中的列 DTYPE varchar(31)。当我的代码尝试保留一个新的 Admin 对象时,我看到以下记录到控制台:

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

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

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

【问题讨论】:

  • 发帖后的 8 小时内我无法回答自己的问题,因此发帖:再想一想:我相信这是因为 User 是抽象的。因为没有User 对象可以直接实例化,所以不需要类型鉴别器,因为类型会提前知道。如果我错了,请告诉我!

标签: hibernate inheritance jpa


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,当我将继承类型更改为加入并且正在努力修复它时,我遇到了同样的问题。谢谢你。您能否确认一下您的 spring 和 hibernate 版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多