2017-04-05 14 views
0

Hibernateバリでの問題4春4Hibernateバリでの問題

で4に休止状態3からのアップグレード後の春で4に休止状態3からアップグレードした後、私は非常に古いJavaプロジェクトを引き継いだ(リッチクライアントは、スイング、休止状態3)これは何らかの自家依存性注入があり、Hibernate 3を使用し、手動トランザクション管理を持っています。すべてのfreakin DAOメソッドが、セッションをオープンするかどうかをトリガするブール値を取得することを意味します。あなたは、多くの場所でその壊れやすい構造に触れると、これが何を意味するのか想像することができます...とにかく、私はここに泣いていません...私の問題です:

私は新しい複雑な機能を実装し、この全体の手動トランザクションの問題は制御不能になり、私は、Springトランザクション管理を休止状態4と組み合わせて使用​​するように顧客にリファクタリングすることができます。

私はこれを実装し始めました。 、今やすべてのことが実行されますが、より詳細なヒックアップがあります。

ナッツを駆動するものは、Hibernate Validatorです。既存の実装は私が推測する古い方法です。すべてのエンティティクラスは、プロジェクトに存在するすべてのエンティティについて、org.hibernate.validator.ClassValidatorを含むDomainObjectという名前のクラスから派生します。 エンティティ自体では、このバリデータは.InvalidValues()で呼び出され、フィールドを検証します。

私はSpring 4.2.4.RELEASEでHibernate-Core 4.3.6.Finalにアップグレードして以来、エンティティを検証する際に多くの問題が発生します。古いValidatorバージョンを使用していますが、上位バージョンにアップグレードすると、プロジェクト全体でThe type org.hibernate.validator.InvalidValue cannot be resolved. It is indirectly referenced from required .class filesのような無数のエラーが発生しますが、これで解決したすべての回答で解決できませんでした。

右は現在、エラーが発生する検証はSwingWorker Threadで実行され、それをデバッグしながら、私はまだから来て、私は問題を想定して例外が春のどこかに深く飲み込まれ、私も :-(スタックトレースを得ることはありません見ることができますここで悪い休止の依存関係の組み合わせが、私はあなたが以下のpom.xmlスニペットで見ることができる 一緒に働く何かを得たまで、私は本当に必死だった。

スニペット

<!-- Hibernate Stuff --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.6.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.5.6-Final</version> 
    <!-- Hibernate Core needs a higher version so we exclude this one --> 
     <exclusions> 
      <exclusion> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-commons-annotations</artifactId> 
       <version>3.2.0.Final</version> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.0-api</artifactId> 
     <version>1.0.1.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 
<!--  <dependency> --> 
<!--   <groupId>org.hibernate</groupId> --> 
<!--   <artifactId>hibernate-c3p0</artifactId> --> 
<!--   <version>3.6.10.Final</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>javassist</groupId> --> 
<!--   <artifactId>javassist</artifactId> --> 
<!--   <version>3.12.0.GA</version> --> 
<!--  </dependency> --> 

<!--  <dependency> --> 
<!--   <groupId>c3p0</groupId> --> 
<!--   <artifactId>c3p0</artifactId> --> 
<!--   <version>0.9.1.2</version> --> 
<!--  </dependency> --> 

これは、私検証中に呼び出されるすべてのエンティティの中で、

/** 
* validate the entity. This method will be called internally before save or 
* update to check validity before sql statements 
*/ 
@Override 
@Transient 
protected InvalidValue[] validate(final String fieldName) { 
    if (fieldName == null) { 
     return VALIDATOR_ASSEMBLY_ENTRY.getInvalidValues(this); 
    } else { 
     return VALIDATOR_ASSEMBLY_ENTRY.getInvalidValues(this, fieldName); 
    } 
} 

ヒント?もっとコードが必要な場合は教えてください。全体のSpringとHibernateの設定はJavaで行われます。 No xml。

+0

あなたのpom.xmlでこれを入れて現在のバージョンのHibernate Validator(または実際にはBean Validation、バージョン4からHibernate Validatorによって実装された仕様です)。 – Gunnar

+0

@Gunnarええ、それは私が期待したものです。だから、すべてのエンティティですべての単一の検証メソッドを無効にすることから始めました(そして、それが役立つかどうかを知るために)...今、それらの奇妙なエラーはなくなりました。しかし、実際にHibernate Validationを実装するには、バージョン4のアノテーション駆動型の方法ではもう少し時間がかかります。春のhibernateバリデーター4を使用したベストプラクティスに関する良いチュートリアルを知っていますか? – m0rb

+0

他の人にこの質問をするヒントをいくつか与えてください:私はHVの新しい実装を終了しました。良い指針は[This](http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single /#section-constraint-composition)と[that](http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#section-obtaining-validator )。 基本的にH-V 3と4の実装はそれほど違いはありません。私はちょうどすべてのカスタムバリデーターがナットを駆動する部品であることを見ていませんでした;-) – m0rb

答えて

0

これを少しの回避策で修正しました。 `InvalidValue`はHibernateバリ4に存在していないと、それは使用していますので、後で、すなわちあなたが「検証中に呼び出されますすべてのエンティティにおける方法」を適応させる必要があるだろう

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator-legacy</artifactId> 
    <version>4.0.2.GA</version> 
</dependency> 
+0

あなたの答え@KimTiagoBaptistaに感謝します。実際は依存関係ではなく、実装が問題でした。例えば。 H-V3の 'org.hibernate.validator.InvalidValue'の配列の代わりに、H-V4のvalidateメソッドが' javax.validation.ConstraintViolation 'のセットを返しますが、コンテキストに関しても同じことをします。 H-V4は春のトランザクション管理にいくつかの奇妙な問題を引き起こしましたが、それはもう一つの長い話です。 – m0rb

関連する問題