1

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」を指定する理由は何ですか?

4

2 に答える 2

1

おそらく、PricePK のフィールド/ゲッターで @Column(nullable = false) のバリアントを使用することで、問題を回避できます。

于 2011-09-10T22:10:54.173 に答える