を使用してhibernate3-maven-plugin
Oracle10g データベースにクエリを実行し、hbm2java
ゴールを使用して JPA アノテーションを使用して Java クラスを生成しています。次に、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 への外部キーである 2 つの列があります。列 FOO.STATUS_CODE は NULL ではない必要がありますが、列 FOO.REASON_CODE は NULL の場合があります。ここでのロジックは、FOO にはステータスが必要ですが、すべてのステータスに理由が必要なわけではないということです。
表 BAR には列 BAR.REASON_CODE および BAR.STATUS_CODE があり、どちらもヌルではありません。ここでのロジックは、さまざまな (すべてではない) ステータス コードの理由を関連付けます。たとえば、ステータスが「キャンセル」の場合、理由は「詐欺」、「能力不足」などである可能性があります。
「アクティブ」などのステータスには関連する理由がないため、テーブル BAR には存在しませんが、テーブル FOO のステータス コードとして発生する可能性があることに注意してください (関連する理由コードなし)。ただし、FOO の行に「キャンセル済み」という状況コードがある場合、その状況のテーブル BAR で定義された理由コードの 1 つも含まれている必要があります。
したがって、テーブル定義は私には問題ないように思えます (私はデータベースの専門家ではありませんが)。
Mavenのhbm2java
ゴールは、テーブル 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 列のみが null 非許容であることに注意してください。
ただし、休止状態のセッション ファクトリ Bean が作成され、注釈付きのクラスがスキャンされると、「プロパティに null 許容列と非 null 許容列を混在させることはできません」という例外が生成されます。
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/hibernate-core/3.5.6-Final
- org.hibernate/hibernate-annotations/3.5.6-Final
- org.springframework/spring-orm/3.1.2-RELEASE
Spring アプリケーション コンテキスト:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.whatever.domain" />
</bean>