2013-02-09 3 views
3

Я решил опробовать Hibernate сегодня, что выглядит многообещающим, хотя настройка может быть проще. После того, как найдены решения для первых миллионов или так конфигурации ошибок Теперь я застрял с этим одна:Hibernate Bean Validation недоступен в пути класса

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 в путь сборки без каких-либо изменений. У меня есть googled для Bean Validation not available in the class path but required in javax.persistence.validation.mode, а также только Bean Validation not available in the class path. Я нашел исходный код, но это не очень помогает.

Я также попытался удалить свойства из файлов конфигурации xml, без везения.

I не использование Maven. Я просто использую Eclipse, а также создаю и запускаю проект непосредственно из Eclipse.

Очевидный вопрос: как я могу решить эту проблему? Нужен ли мне дополнительный кувшин в моем пути сборки, который я пропустил? (В том случае, какой?), А также: зачем это нужно? Могу ли я что-то изменить, чтобы он больше не нужен?

ответ

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, вам нужно самостоятельно создать путь к классу, и его легко пропустить банку. Возможно, стоит просто использовать maven для загрузки вашего проекта и убедиться, что у вас все банки на месте.
  • Если вы используете maven, validation-api вытягивается как транзитивная зависимость от hibernate-validator.
+0

Если вы не используете JEE6, тогда барабан API проверки не должен использоваться, поскольку он в комплекте. –

+0

Наконец-то эта проблема решена. (Удивленный я не мог найти предыдущий вопрос для этого) Я также выяснил, что мне это тоже нужно: http://mvnrepository.com/artifact/org.hibernate/hibernate-validator Следующий проект будет состоять в том, чтобы узнать Maven, я полагаю :) ... а затем, наконец, понять git: P (хотя я использовал git ранее) –

+0

Maven действительно помогает вам справиться с этими проблемами зависимости. Большинство фреймворков (spring/hibernate/....) используют его, чтобы получить немедленную выгоду. – ddewaele

2

Вам нужен 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, это просто дополнение, определенное в спецификации JPA. Если проверка бина включена в процедуру проверки жизненного цикла на основе класса (проверка сущностей на предварительном обновлении, предварительном сохранении и т. Д.) Автоматически включается (см. Также http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#d0e3096 и, конечно, спецификация JPA 2).

С другой стороны, если у вас нет проверки бина на пути к классам, но явным образом прошу об этом с помощью опции конфигурации в режиме .xml вы получите сообщение об ошибке.

+1

Мне нравится, как вы читаете вопрос ... «Я ** не ** использую maven [...]» – Vogel612

+0

Просто потому, что я использовал GAV для указания того, что вам нужно, я не подразумеваю, что вам нужно использовать Maven. Вы можете использовать что угодно, но мне нужно указать правильный артефакт. Использование нотации зависимостей в этом случае весьма полезно и не связано с использованием Maven. – Hardy

+0

Почему бы не вместо этой XML-нотации, зависящей от зависимостей, использовать что-то вроде: 'org.hibernate.hibernate-validator-4.3.1.Final.jar' (это то, что вы получаете в любом случае), и это намного больше" google «дружелюбно», чем xml? – Vogel612

Смежные вопросы