3

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;

  ....
}
4

0 に答える 0