3

使用 SINGLE_TABLE 继承,表示子类属性的列必须可以为空,即使属性本身是强制性的。但是在我们的例子中,Hibernate 生成非空约束,即使它不应该。例子:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Animal {
  @Id
  private int id;

  @Basic(optional = false)
  private String name;

  ...
}

@Entity
public class Pet extends Animal {
  @ManyToOne(optional = false)
  private Person owner;

  ...
}

@Entity
public class WildAnimal extends Animal {
  @Basic(optional = false)
  private String primaryHabitat;

  ...
}

生成的 DDL 是(目标是 HSQLDB):

create table Animal (DTYPE varchar(31) not null, id integer not null, 
                     name varchar(255) not null, primaryHabitat varchar(255), 
                     owner_id integer not null, primary key (id))

如您所见,owner_id 得到一个非空约束,即使 WildAnimal 没有使用它。另请注意,这是@ManyToOne 的问题,而不是@Basic。

添加 @JoinColumn(nullable = true) 无效。

我猜这是 Hibernate 中的一个错误,但我的问题是是否有可能解决这个问题并仍然强制执行属性/关联的“强制性”?

我们使用的是 Hibernate Core 4.1.8。

编辑

人看起来像这样(与宠物没有关联):

@Entity
public class Person {
  @Id
  private int id;

  @Basic(optional = false)
  private String name;

  ....
}
4

0 回答 0