3

我今天决定尝试 Hibernate,它看起来很有希望,尽管设置可能更容易。在为前一百万个左右的配置错误找到解决方案后,我现在陷入了这个问题:

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

持久性.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.mode,也只是Bean Validation not available in the class path. 我找到了源代码,但这对我没有多大帮助。

我还尝试从 xml 配置文件中删除属性,但没有任何运气。

使用 Maven。我只是使用 Eclipse 并直接从 Eclipse 构建和运行项目。

显而易见的问题是:我该如何解决这个问题?我是否需要在我错过的构建路径中添加一个 jar?(在那种情况下是哪一个?)还有:为什么需要它?我可以更改某些内容以使其不再需要吗?

4

2 回答 2

7

你需要在你的类路径中有validation-api(你可以使用一个下载JAR 链接,因为你不使用maven)。

Hibernate 在类路径中搜索 javax.validation.Validation 类。如果它没有找到它,它会抛出Bean Validation not available in the class path but required in javax.persistence.validation.mode错误。

  • 如果您不使用 maven,则需要自己构建类路径,并且很容易错过 jar。仅使用 maven 引导您的项目并确保您拥有所有 jar 文件可能是值得的。
  • 如果您使用的是 maven,validation-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 验证约束(例如 @NotNull、@Before、@Pattern 等),您也可以删除

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

或将其设置为 NONE。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 回答