2010-09-17 3 views
20

Я новичок в JPA & Hibernate. Прочитав некоторые онлайн-материалы, я теперь понимаю, что такое Hibernate и как его можно использовать с JPA.javax.persistence.PersistenceException: поставщик постоянства для EntityManager с именем customerManager

Теперь я пытаюсь запустить этот JPA & Hibernate tutorial. Я сделал все, что они упомянули в этом уроке.

У меня нет Oracle DB, только MySQL. Так что я сделал некоторые изменения в persistence.xml используя мое понимание JPA & Hibernate (я не знаю, если это правильно или нет ... Мне кажется, что это.)

Вот мой persistence.xml

<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_1_0.xsd" version="1.0"> 
    <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>Customer</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value="1234"/> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/> 
     <property name="hibernate.max_fetch_depth" value="3"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Но я, похоже, не получаю информацию, которую они описывают. Это мне дает:

Customer id before creation:null 
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). 
log4j:WARN Please initialize the log4j system properly. 
Exception in thread "main" javax.persistence.PersistenceException: No Persistence  provider for EntityManager named customerManager 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) 
at CustomerDAO.create(CustomerDAO.java:8) 
at CustomerDAO.main(CustomerDAO.java:22) 

Любые предложения будут оценены.

Update:

Я сделал изменения, которые просят сделать. Но, все еще получая строки ошибки asme !!!

Они ничего не упомянули о orm.xml в этом учебнике. это может быть проблема.

ответ

19

Не удалось создать persistence.xml и создать EntityManagerFactory. Оно должно быть:

<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_1_0.xsd" version="1.0"> 
    <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>Customer</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value="1234"/> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/> 
     <property name="hibernate.max_fetch_depth" value="3"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

(Обратите внимание, как <property> элементы закрыты, они не должны быть вложенными)

Update: Я прошел через учебник, и вы также должны изменить Id поколение стратегии при использовании MySQL (поскольку MySQL не поддерживает последовательности). Я предлагаю использовать стратегию AUTO (по умолчанию IDENTITY с MySQL). Для этого удалите SequenceGenerator аннотацию и изменить код так:

@Entity 
@Table(name="TAB_CUSTOMER") 
public class Customer implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="CUSTOMER_ID", precision=0) 
    private Long customerId = null; 

    ... 
} 

Это должно помочь.

PS: вы также должны указать log4j.properties, как предложено.

+0

Спасибо за ваш ответ. Но он все равно дает то же сообщение об ошибке. Исключение в потоке «main» javax.persistence.PersistenceException: нет поставщика устойчивости для EntityManager с именем customerManager – 2010-09-17 22:41:05

+0

Еще раз спасибо за ваше обновление. Я добавил, что log4j.jar в папке lib, как они сказали в учебнике. Каков способ его инициализации? – 2010-09-17 23:28:19

+0

@MaRaVan Вам нужно поставить 'log4j.свойства' на пути к классам. В этом примере приведен пример. –

0

Немного слишком поздно, но я получил тот же вопрос и фик его переключения SchemaLocation в SchemaLocation в persistence.xml файл (строка 1).

8

Я столкнулся с той же проблемой. Я понял, что я использую Неверный класс провайдера в настойчивости.XML

Для Hibernate это должно быть

<provider>org.hibernate.ejb.HibernatePersistence</provider> 

И EclipseLink должно быть

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
25

только для полноты картины. есть другая ситуация, вызывающая эту ошибку: отсутствует META-INF/services/javax.persistence.spi.PersistenceProvider. для hibernate он находится в hibernate-entitymanager-XXX.jar, поэтому, если hibernate-entitymanager-XXX.jar не находится в вашем пути к классу, вы также получите эту ошибку.

это сообщение об ошибке настолько вводит в заблуждение, и мне стоит часов, чтобы понять его.

см. this question.

+0

спасибо, это помогает! –

+0

очень полезно, эта ошибка стоила мне, как час, чтобы решить эту проблему. благодаря! –

+0

спасибо за это! Странно, как так много уроков опускают эту важную информацию! – NickJ

0

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

Я поймал ту же самую ошибку msg сегодня, когда я попытался запустить пакет jar, упакованный муравьями.

Когда я использовал jar tvf для проверки содержимого файла jar, я понял, что «муравей» забыл упаковать persistnece.xml для меня.

после того, как я вручную упаковал файл jar, ошибка msg исчезла.

, поэтому я считаю, что вам следует попробовать простую установку META-INF под каталог src и размещение там вашего persistence.xml.

12

У меня была такая же проблема сегодня. Мой persistence.xml оказался не в том месте. Я должен был поставить его по следующему пути:

project/src/main/resources/META-INF/persistence.xml 
+1

Это сделало трюк. –

0

Я видел эту ошибку, для меня вопрос был там было пространство в абсолютном пути persistance.xml, удаление одного и того же помог мне.

0

У меня также была проблема с тем же вопросом, когда я пытался настроить диспетчер объектов JPA в Tomcat 8. Сначала у меня проблема с классом SystemException, который не найден, и, следовательно, entityManagerFactory не создавался. Я удалил зависимость менеджера сущностей спящего режима, а затем мой entityManagerFactory не смог найти поставщика устойчивости. После много исследований и времени стало известно, что администратор сущностей спящего режима должен найти какую-то конфигурацию. Затем верните контейнер менеджера объектов, а затем добавьте JTA Api в качестве зависимости, и он отлично работает.

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