Ошибка спящего режима: смешивание значений Nullable и Nullable в коде hbm2java

Я использую hibernate3-maven-plugin запросить базу данных Oracle10g и сгенерировать Java-классы с аннотациями JPA, используя hbm2java Цель. Затем я использую Spring для настройки фабрики сессий, которая сканирует аннотированный код.

После долгой борьбы с hbm2javaМне удалось сгенерировать мои классы, но теперь у меня возникла другая проблема: я получаю исключение "Смешивание пустых и необнуляемых столбцов в свойстве недопустимо", когда аннотированные классы загружены.

База данных определяет таблицы FOO и BAR следующим образом:

CREATE TABLE FOO (
  STATUS_CODE ... NOT NULL,
  REASON_CODE ...);

ALTER TABLE FOO ADD (
  CONSTRAINT FK_BAR
  FOREIGN KEY (REASON_CODE, STATUS_CODE)
  REFERENCES BAR(REASON_CODE, STATUS_CODE));

CREATE TABLE BAR (
  STATUS_CODE ... NOT NULL,
  REASON_CODE ... NOT NULL);

ALTER TABLE BAR (
  PRIMARY KEY (REASON_CODE, STATUS_CODE));

Таким образом, таблица FOO имеет два столбца, которые являются внешними ключами в таблице BAR. Столбец FOO.STATUS_CODE должен быть ненулевым, но столбец FOO.REASON_CODE может быть нулевым. Логика здесь в том, что FOO нужен статус, но не каждому статусу нужна причина.

Таблица BAR содержит столбцы BAR.REASON_CODE и BAR.STATUS_CODE, которые не являются нулевыми. Логика здесь связывает причины для различных (но не всех) кодов состояния. Так, например, если статус "отменен", то причинами могут быть "мошенничество", "некомпетентность" и т. Д.

Обратите внимание, что такой статус, как "активный", не имеет какой-либо связанной причины и поэтому не существует в таблице BAR, но он может возникать как код состояния в таблице FOO (без связанного кода причины). Но если строка в FOO имеет код состояния "отменен", то для нее также должен быть один из кодов причин, определенных в таблице BAR для этого статуса.

Поэтому определения таблиц кажутся мне подходящими (хотя я не эксперт по базам данных).

Теперь hbm2java Цель в Maven генерирует следующий код для таблицы FOO:

private Bar bar;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns( { 
    @JoinColumn(name="REASON_CODE", referencedColumnName="REASON_CODE"), 
    @JoinColumn(name="STATUS_CODE", referencedColumnName="STATUS_CODE", nullable=false) } )
public Bar getBar() {
    return this.bar;
}

Обратите внимание, что только столбец STATUS_CODE здесь не обнуляется.

Но когда компонент фабрики сеанса гибернации создается и сканирует аннотированные классы, генерируется исключение "Смешивание пустых и ненулевых столбцов в свойстве".

Caused by: org.hibernate.AnnotationException: Mixing nullable and non nullable columns in a property is not allowed: com.whatever.domain.LnrPermissionlnrPermStatusReason
  at org.hibernate.cfg.Ejb3Column.checkPropertyConsistency(Ejb3Column.java:514)
  at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2568)
  at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1527)
  at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:769)
  at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733)
  at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:636)

Вопрос

Является ли это допустимой ошибкой, вызванной кодом обработки аннотаций в спящем режиме (в этом случае определения таблиц в базе данных требуют изменения), или это неверно? И если последнее, я могу настроить код фабричной сессии, чтобы игнорировать такие ошибки?

конфигурация

Maven зависимости:

  • org.hibernate / гибернации-ядро / 3.5.6-Final
  • org.hibernate / спящая-аннотации / 3.5.6-Final
  • org.springframework / весна-ОРМ /3.1.2-RELEASE

Весенний прикладной контекст:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.whatever.domain" />
</bean>

0 ответов

Другие вопросы по тегам