Hibernate:对于InheritanceType.SINGLE_TABLE,子类外键列不为null

时间:2013-10-31 10:10:15

标签: java hibernate jpa orm

使用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;

  ....
}

0 个答案:

没有答案