Java Hibernate:InheritanceType.SINGLE_表的子类外键列不为null

Java Hibernate:InheritanceType.SINGLE_表的子类外键列不为null,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,对于单表继承,表示子类属性的列必须是可空的,即使属性本身是必需的。但在我们的例子中,Hibernate生成非空约束,即使它不应该生成。例如: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public abstract class Animal { @Id private int id; @Basic(optional = false) private String name; ... } @

对于单表继承,表示子类属性的列必须是可空的,即使属性本身是必需的。但在我们的例子中,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):

如您所见,即使WildAnimal未使用所有者id,它也会获得一个NOTNULL约束。还要注意的是,这是@ManyToOne的问题,而不是@Basic的问题

添加@JoinColumn(nullable=true)没有效果

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

我们正在使用Hibernate Core 4.1.8

编辑

此人看起来像这样(与宠物无关):


宠物>人是双向的吗?你能给我看一下Person类吗?它是单向的。此人不了解Pets。能否尝试显式定义多通的联接列@JoinColumn(name=“owner\u id”,nullable=true)。JPA规范说默认的nullable应该为true,但是可能值得一试。在JoinColumn中指定列名不会改变任何东西,我已经尝试了nullable,正如在文章中所述。在生成架构后删除null约束,或者指定columnDefiniton属性(尽管作为特定于数据库的属性并不理想),或者,正如您所说,不使用它。没有它的一个副作用是,即使您指定了Lazy,那个人也总是会被急切地抓到。
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))
@Entity
public class Person {
  @Id
  private int id;

  @Basic(optional = false)
  private String name;

  ....
}