2013-02-09 19 views
3

我決定今天嘗試一下Hibernate,雖然安裝起來可能更容易,但看起來很有希望。Hibernate Bean驗證在類路徑中不可用

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到構建路徑沒有任何改變。我搜索了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嗎? (在那種情況下哪一個?)以及:爲什麼需要?我可以改變一些東西,以便它不再需要嗎?

回答

6

您需要在類路徑中有validation-api(您可以使用下載的JAR鏈接,因爲您不使用maven)。

Hibernate在類路徑中搜索javax.validation.Validation類。 如果它沒有找到它會拋出Bean Validation not available in the class path but required in javax.persistence.validation.mode錯誤。

  • 如果你不使用maven,你需要自己建立classpath,很容易錯過jar。只需使用maven引導你的項目,並確保你有所有的罐子,這可能是值得的。
  • 如果您使用的是maven,那麼validation-api將作爲hibernate-validator的傳遞依賴關係被引入。
+0

除非您使用JEE6,否則驗證API jar不應該被使用,因爲它是捆綁的。 – 2013-02-09 21:12:29

+0

最後,問題解決了。 (驚訝我找不到以前的問題)我也發現我也需要這個:http://mvnrepository.com/artifact/org.hibernate/hibernate-validator下一個項目將學習Maven我想:) ...然後終於明白git:P(儘管我之前使用過git) – 2013-02-09 21:19:12

+0

Maven在處理這些依賴性問題方面確實幫助你很多。大多數框架(spring/hibernate/....)都使用它,所以你立即獲得了好處。 – ddewaele 2013-02-09 21:26:03

2

您需要的Hibernate驗證神器:

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

這也將包括Bean驗證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,但通過持久性中的配置選項明確要求它。xml你得到你描述的錯誤。

+1

我喜歡你如何閱讀這個問題......「我**不要**使用maven [...]」 – Vogel612 2014-05-28 09:30:40

+0

僅僅因爲我使用了GAV來指定你需要的東西,我並不是暗示你必須使用Maven的。你可以使用任何東西,但不知何故,我需要指定正確的工件。在這種情況下使用依賴表示法非常有用,並且不會使用Maven。 – Hardy 2014-05-28 09:49:30

+0

爲什麼不用這種依賴性管理特定的xml-notation來使用類似於'org.hibernate.hibernate-validator-4.3.1.Final.jar'(這是你得到的任何一種方式),而且更多的是「google友好「比XML? – Vogel612 2014-05-28 09:52:06