Impossible d'exécuter JPA2 avec Hibernate et Maven
Avons essayé tout au long de la journée et googlé le **** sur le web ... en vain. Vous êtes mon dernier espoir:
Voici mon code:
L'Entité:
package sas.test.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id private int id;
private String name;
private long salary;
public Employee() {}
public Employee(int id) { this.id = id; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public long getSalary() { return salary; }
public void setSalary (long salary) { this.salary = salary; }
}
La classe de service:
package sas.test.dao;
import sas.test.model.Employee;
import javax.persistence.*;
import java.util.List;
public class EmployeeService {
protected EntityManager em;
public EmployeeService(EntityManager em) {
this.em = em;
}
public Employee createEmployee(int id, String name, long salary) {
Employee emp = new Employee(id);
emp.setName(name);
emp.setSalary(salary);
em.persist(emp);
return emp;
}
public void removeEmployee(int id) {
Employee emp = findEmployee(id);
if (emp != null) {
em.remove(emp);
}
}
public Employee raiseEmployeeSalary(int id, long raise) {
Employee emp = em.find(Employee.class, id);
if (emp != null) {
emp.setSalary(emp.getSalary() + raise);
}
return emp;
}
public Employee findEmployee(int id) {
return em.find(Employee.class, id);
}
}
Et la classe principale:
package sas.test.main;
import javax.persistence.*;
import java.util.List;
import sas.test.model.Employee;
import sas.test.dao.EmployeeService;
public class ExecuteMe {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("EmployeeService");
EntityManager em = emf.createEntityManager();
EmployeeService service = new EmployeeService(em);
//create and persist an employee
em.getTransaction().begin();
Employee emp = service.createEmployee(158, "John Doe", 45000);
em.getTransaction().commit();
System.out.println("Persisted " + emp);
//find a specific employee
emp = service.findEmployee(158);
System.out.println("Found " + emp);
//find all employees
// List<Employee> emps = service.findAllEmployees();
//for (Employee e : emps)
// System.out.println("Found employee: " + e);
//update the employee
em.getTransaction().begin();
emp = service.raiseEmployeeSalary(158, 1000);
em.getTransaction().commit();
System.out.println("Updated " + emp);
//remove an employee
em.getTransaction().begin();
service.removeEmployee(158);
em.getTransaction().commit();
System.out.println("Removed Employee 158");
//close the EM and EMF when done
em.close();
emf.close();
}
}
Enfin mes confs.
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Test_JPA_CRUD</groupId>
<artifactId>Test_JPA_CRUD</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>Test_JPA_CRUD</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven</name>
<url>http://download.java.net/maven/2/
</url>
<layout>default</layout>
</repository>
<repository>
<id>maven.org</id>
<name>maven.org Repository</name>
<url>http://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<!--
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
</dependency>
-->
<!--
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
-->
<!-- JPA2 provider -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
</dependency>
<!-- JDBC driver -->
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.5.3.0_1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>3.3.2.Beta1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- compile with mvn assembly:assembly -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
</plugin>
<!-- compile with mvn assembly:assembly -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>sas.test.main.ExecuteMe</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
</execution>
</executions>
</plugin>
<plugin>
<!-- Force UTF-8 & Java-Version 1.6 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<!--<encoding>utf-8</encoding>-->
</configuration>
</plugin>
</plugins>
</build>
</project>
et la persistence.xml qui, je le promets, est dans le classpath de la cible:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
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
http://java.sun.com/xml/ns/persistence ">
<persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>sas.test.model.Employee</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:webdb;create=true"/>
</properties>
</persistence-unit>
</persistence>
Comme vous pouvez le constater à partir des commentaires du code, j'ai essayé les deux, la veille prolongée et le J2EE 6 mise en œuvre de JPA2.0, cependant, ont tous deux échoué. Le code se termine avec l'erreur suivante:
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" java.lang.UnsupportedOperationException: The user must supply a JDBC connection
at org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
Aucune idée de ce qui va mal? Tout "Hello World" maven/JPA2 démo qui fonctionne en fait? Je ne pouvais pas obtenir un de ceux fournis par google de la recherche en cours d'exécution.
Merci à l'avance.
source d'informationauteur Ta Sas
Vous devez vous connecter pour publier un commentaire.
Hibernate EntityManager 3.4.0.GA est pas une JPA 2.0 mise en œuvre afin de ne pas soutenir la normalisation de la
javax.persistence.*
propriétés dans lepersistence.xml
(d'où l'exception sur les pas de connexion JDBC être fourni). Pour JPA 2.0, vous avez besoin d'Hibernate EM 3.5.1-Finale. Ci-dessous un simple POM avec le bouton droit de la dépendance:Et c'est tout ce dont vous avez besoin, d'autres dépendances seront tiré de manière transitive. Il suffit de remplacer le slf4j de liaison, je suis une utilisation avec votre préféré.
Si vous souhaitez utiliser Bean Validation (JSR-303) de l'API et de la RI, ajouter (adapter le champ d'application pour l'adapter à vos besoins):
Je n'ai pas testé ton code, mais cela permettra au moins de fixer votre POM.
PS: Vous n'avez pas besoin de spécifier le fournisseur de persistance dans votre
persistence.xml
si il y a un seul sur le chemin de la classe, vous n'avez pas besoin de spécifier le dialecte. Mais cela ne devrait pas faire de mal.PPS: Notez que
javax.persistence:persistence-api:jar:1.0
est une API, pas de mise en œuvre, il ne fait rien par lui-même (je veux dire, ce n'est pas un remplacement pour Hibernate, EclipseLink, etc).Si vous n'êtes pas à l'aide de Maven dépendance et en utilisant uniquement de l'éclipse paramètres de chemin de classe, vous avez juste besoin de mettre la fichiers jar dans le classpath de mise en veille prolongée 3,5 et plus
1) hibernate core Pot
2) hibernate annotations pot
3) jboss journalisation pot
4) hibernate entity manager pot
API JPA 2. jar (inclus dans hibernate distribution).
J'ai eu des problèmes similaires et j'ai utilisé cette approche et cela a fonctionné. L'obtention de toutes les depedent jar à partir de la même version de la distribution est la meilleure idée. Si vous trouvez une erreur, vous pouvez le trouver dans les journaux et aller mettre le jar dans le classpath
Une chose importante que je n'ai pas trouvé dans mon prédécesseur ne l'ai pas mentionné, mais semble être crucial est à ajouter à la veille prolongée dépendance fourni portée. De sorte que, résultant de la guerre/de l'oreille, ces ne sont pas ajoutés.
Je me fallut du temps pour trouver que, donc, je vais le rappeler pour les autres.