Ошибка спящего режима: смешивание значений 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>