我今天决定试用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
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>
我尝试在构建路径中添加this而不做任何更改。我用Google搜索了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? (在那种情况下哪一个?)还有:为什么需要它?我可以改变一些东西,以便不再需要吗?
答案 0 :(得分:7)
您需要在类路径中拥有validation-api(您可以使用的下载JAR链接,因为您不使用maven)。
Hibernate在类路径中搜索javax.validation.Validation类。
如果它没有找到它,则会抛出Bean Validation not available in the class path but required in javax.persistence.validation.mode
错误。
答案 1 :(得分:3)
您需要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>
或将其设置为NONE。 Hibernate使用不需要Bean验证它只是JPA规范中定义的附加组件。如果Bean验证是基于类路径生命周期的验证(更新前的实体验证,预先保留等),则会自动启用(另请参阅http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#d0e3096,当然还有JPA 2规范)。
另一方面,如果您没有在类路径上进行Bean Validation,但是通过 persistence.xml 中的配置选项明确要求它,则会收到您描述的错误。