5

を使用してhibernate3-maven-pluginOracle10g データベースにクエリを実行し、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>
4

0 に答える 0