hbm2ddl (hibernate3-maven-plugin 2.2 から) を使用して、JPA アノテーション付きエンティティに基づいて DDL を生成しています。通常、これは正常に機能しますが、最近、2 つの外部キーで構成される複合キーを使用するエンティティを導入したため、DDL 生成で問題が発生しています。
具体的には、生成される DDL は、主キー列が NULL 可能であることを指定しており、これは主キー列には当てはまりません。その結果、MSSQL は、列が NULL 可能であるため、主キー制約を作成できません。
エンティティはこちら
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@IdClass(PricePK.class)
public class Price extends PersistentEntity {
@Id
@ManyToOne(optional = false)
private Product product;
@Id
@ManyToOne(optional = false)
private Currency currency;
@Column(nullable = false)
private BigDecimal amount;
...etc...
}
エンティティは、主キー クラスとして PricePK を使用すること、さらに重要なこととして、主キーを構成する 2 つの ManyToOne エンティティがオプションではないことを指定します (これは、列が DDL で「null でない」ことを意味する必要があります)。PricePK クラスは次のとおりです。
@Embeddable
public class PricePK implements Serializable {
Integer product;
Integer currency;
...etc...
}
Price テーブル用に生成される DDL は次のとおりです。currency_id と product_id の両方が null を許可することに注意してください。
create table PRICE (
version int null,
amount numeric(19,2) not null,
currency_id int null,
product_id int null,
primary key (currency_id, product_id)
);
MSSql でスクリプトを実行しようとすると、次の (驚くべきことではありませんが) エラーが発生します。
失敗: テーブル store.PRICE の作成 (version int null, amount numeric(19,2) null, currency_id int null, product_id int null, primary key (currency_id, product_id)) テーブル 'PRICE' の null 許容列に PRIMARY KEY 制約を定義できません.
生成されている DDL がこれら 2 つの外部キー列に「null」を指定する理由は何ですか?