SINGLE_TABLE 継承では、属性自体が必須であっても、サブクラス属性を表す列は null 許容でなければなりません。しかし、私たちの場合、Hibernate は not null 制約を生成すべきではない場合でも生成します。例:
@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))
ご覧のとおり、所有者 ID は、WildAnimal によって使用されていない場合でも、null でない制約を取得します。これは @ManyToOne の問題であり、@Basic の問題ではないことにも注意してください。
@JoinColumn(nullable = true) を追加しても効果はありません。
これは Hibernate のバグだと思いますが、私の質問は、これを回避し、属性/関連付けの「必須性」を強制することができるかどうかです。
Hibernate Core 4.1.8 を使用しています。
編集
Person は次のようになります (Pet との関連付けはありません):
@Entity
public class Person {
@Id
private int id;
@Basic(optional = false)
private String name;
....
}