3

今日は Hibernate を試してみることにしました。最初の 100 万個程度の構成エラーの解決策を見つけた後、次のエラーに行き詰まりました。

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: manager1] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)
(...)
Caused by: org.hibernate.HibernateException: Bean Validation not available in the class path but required in javax.persistence.validation.mode
    at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyHibernateListeners(BeanValidationIntegrator.java:281)
    at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:134)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:303)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
    ... 5 more

Peristence.xml:

<?xml version='1.0' encoding='utf-8' ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
   <persistence-unit name="manager1" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <class>net.zomis.hibernate.Game</class>
      <class>net.zomis.hibernate.TestFields</class>
      <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
      <validation-mode>CALLBACK</validation-mode>
      <properties>
          <property name="javax.persistence.validation.mode" value="NONE" />  
         <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
         <property name="hibernate.hbm2ddl.auto" value="validate"/>
      </properties>
   </persistence-unit>
</persistence>

(私が知る限り)の関連部分hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        (...)
        <property name="hbm2ddl.auto" >validate</property>
        <mapping class="net.zomis.hibernate.Game" />
        <mapping class="net.zomis.hibernate.TestFields" />
    </session-factory>
</hibernate-configuration>

これを変更せずにビルドパスに追加しようとしました。私はグーグルで検索しましBean Validation not available in the class path but required in javax.persistence.validation.modeBean Validation not available in the class path。ソースコードを見つけましたが、あまり役に立ちません。

また、xml 構成ファイルからプロパティを削除しようとしましたが、うまくいきませんでした。

Maven は使用しません。私は単純に Eclipse を使用し、Eclipse から直接プロジェクトをビルドして実行します。

明らかな質問は次のとおりです。この問題をどのように解決できますか? 見逃したビルド パスに追加の jar が必要ですか? (その場合はどれですか?)そしてまた:なぜそれが必要なのですか?何かを変更して不要にすることはできますか?

4

2 に答える 2

7

クラスパスにvalidation-apiが必要です(Maven を使用しないので使用できるダウンロード JAR リンクがあります)。

Hibernate はクラスパスで javax.validation.Validation クラスを検索します。見つからない場合は、Bean Validation not available in the class path but required in javax.persistence.validation.modeエラーがスローされます。

  • Maven を使用していない場合は、自分でクラスパスを構築する必要があり、jar を見逃すのは簡単です。Maven を使用してプロジェクトをブートストラップし、すべての jar が配置されていることを確認するだけでも価値があるかもしれません。
  • Maven を使用している場合、検証 API は hibernate-validator から推移的な依存関係として取り込まれます。
于 2013-02-09T21:03:35.820 に答える
4

Hibernate Validator アーティファクトが必要です。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.1.Final</version>
</dependency>

これには Bean Validation API も含まれますが、これはこの場合も要件です。

Bean Validation 制約 (@NotNull、@Before、@Pattern など) を使用していない場合は、単に削除することもできます

<validation-mode>CALLBACK</validation-mode>

またはなしに設定します。Hibernate の使用に Bean Validation は必要ありません。JPA 仕様で定義されている単なるアドオンです。Bean Validation がクラスパスにある場合、ライフ サイクル ベースの検証 (更新前、永続化前などのエンティティの検証) は自動的に有効になります ( http://docs.jboss.org/hibernate/stable/validator/reference/も参照)。 en-US/html_single/#d0e3096そしてもちろん JPA 2 仕様)。

一方、クラスパスに Bean Validation がないが、persistence.xmlの構成オプションを介して明示的に要求すると、説明したエラーが発生します。

于 2013-02-11T09:39:24.373 に答える