javahibernateormjpa

javax.persistence.PersistenceException: No Persistence provider for EntityManager named customerManager


I am new to JPA & Hibernate. After reading some online materials I now understand what Hibernate is and how it can be used with JPA.

Now, I am trying to run this JPA & Hibernate tutorial. I've done everything they mention in this tutorial.

I don't have Oracle DB, only MySQL. So I made some changes to persistence.xml using my understanding of JPA & Hibernate (I don't know if it's correct or not... Seems to me it is.)

Here is my 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>

But I don't seem to get the output they describe. It's giving me:

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)

Any suggestions will be appreciated.

Update:

I have made the changes that are asked to done. But, still getting the asme error lines!!!

They didnt mentioned anything about orm.xml in that tutorial. may it be a problem causer!!!


Solution

  • Your persistence.xml is not valid and the EntityManagerFactory can't get created. It should be:

    <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>
    

    (Note how the <property> elements are closed, they shouldn't be nested)

    Update: I went through the tutorial and you will also have to change the Id generation strategy when using MySQL (as MySQL doesn't support sequences). I suggest using the AUTO strategy (defaults to IDENTITY with MySQL). To do so, remove the SequenceGenerator annotation and change the code like this:

    @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;
    
       ...
    }
    

    This should help.

    PS: you should also provide a log4j.properties as suggested.