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