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