генерировать DDL из аннотаций JPA - PullRequest
0 голосов
/ 22 июня 2011

У меня есть следующие классы в моей модели JPA (геттеры, сеттеры и нерелевантные поля опущены):

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@IdClass(PricePK.class)
public class Price {

    @Id
    @ManyToOne(optional = false)
    private Product product;

    @Id
    @ManyToOne(optional = false)
    private Currency currency;
}

@Embeddable
public class PricePK implements Serializable {

    Integer product;        
    Integer currency;
}

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Currency extends PersistentEntity {

    @Id
    private Integer ix;
}

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Product extends AutoIdPersistentEntity {
}

@MappedSuperclass
public abstract class AutoIdPersistentEntity extends PersistentEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
} 

Я использую цель hbm2ddl плагина hibernate3 Maven для созданияDDL из этих классов.Он генерирует следующее для таблицы, соответствующей Price классу

create table PRICE (
    currency_id int null,
    product_id int null,
    primary key (currency_id, product_id)
);

. Обратите внимание, что оба значения currency_id и product_id могут иметь значение null, что приводит к следующей ошибке при попытке загрузить DDL в SQLСервер

Невозможно определить ограничение PRIMARY KEY для столбца со значением NULL в таблице 'PRICE'

Я не понимаю, почему они имеют значение NULL, поскольку в модели домена они аннотированы@ManyToOne(optional = false)

DDL генерируется с использованием диалекта org.hibernate.dialect.SQLServerDialect SQL.

1 Ответ

1 голос
/ 22 июня 2011

Это немного сбивает с толку, но я думаю, что необязательный атрибут (@ManyToOne, @Basic, ...) не используется для генерации схемы некоторыми реализациями JPA.

Я думаю, что вам нужно использовать @JoinColumnаннотации и установите для nullable значение false: http://download.oracle.com/javaee/6/api/javax/persistence/JoinColumn.html

(или @Column в случаях, не связанных с соединением: http://download.oracle.com/javaee/6/api/javax/persistence/Column.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...