Я использую hbm2ddl (из hibernate3-maven-plugin 2.2) для создания DDL на основе моих аннотированных сущностей JPA.Обычно это работает нормально, но я недавно представил объект, который использует составной ключ, состоящий из двух внешних ключей, и это вызывает проблему с генерацией DDL.
В частности, сгенерированный DDL указывает, что столбцы первичного ключа имеют значение NULL, и это не должно иметь место в случае столбцов первичного ключа.В результате MSSQL не удается создать ограничения первичного ключа из-за обнуляемости столбца.
Вот сущность
@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 в качестве класса первичного ключаи, что более важно, две сущности ManyToOne, которые составляют первичный ключ, не являются необязательными (что должно означать, что столбцы не равны нулю в DDL).Вот класс PricePK:
@Embeddable
public class PricePK implements Serializable {
Integer product;
Integer currency;
...etc...
}
DDL, который создается для таблицы цен, выглядит следующим образом - обратите внимание, что оба параметра currency_id и product_id допускают нулевое значение:
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 (версия int null, количество числовое (19,2) null, currency_id int null, product_idint null, первичный ключ (currency_id, product_id)) Невозможно определить ограничение PRIMARY KEY для столбца со значением NULL в таблице 'PRICE'.
Любая идея, почему в создаваемом DDL для этих двух значений указывается 'null'столбцы внешнего ключа?