2010-04-22 64 views
10

已經嘗試了整整一天,並將****從網上搜索出來...徒勞無功。你是我最後的希望:無法使用Hibernate和Maven運行JPA2

這裏是我的代碼:

實體:

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

服務類:

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); 
    } 

} 

和主類:

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(); 
    } 
} 

最後我的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> 

和persistence.xml中,其中,我保證,在目標的類路徑:

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

正如你可能已經從一些註釋代碼注意到,我嘗試了兩種,即Hibernate和JPA2.0的J2EE 6實現,但都失敗了。上述代碼結束時出現以下錯誤:

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) 

任何想法發生了什麼問題?任何實際運行的「Hello World」maven/JPA2演示?我無法得到谷歌搜索運行提供的任何。

Thanx提前。

回答

19

休眠的EntityManager 3.4.0.GA是一個JPA 2.0實施,所以它不會支持在persistence.xml標準化javax.persistence.*屬性(約沒有JDBC連接因此例外被提供)。對於JPA 2.0,您需要Hibernate EM 3.5.1-Final。下面以一個簡單的POM用正確的依賴性:

<project> 
    ... 
    <repositories> 
    <repository> 
     <id>jboss</id> 
     <name>JBoss repository</name> 
     <url>http://repository.jboss.org/maven2</url> 
    </repository> 
    </repositories> 

    <dependencies> 
    <!-- JPA API and Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.5.1-Final</version> 
    </dependency> 

    <!-- Logging --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-simple</artifactId> 
     <version>1.5.8</version> 
    </dependency> 

    ... 
    </dependencies> 
    ... 
</project> 

這就是你所需要的,其他的依賴將被拉到及物動詞。只需將我正在使用的slf4j綁定替換爲您最喜歡的一個即可。

如果你想使用Bean驗證(JSR-303)API和RI,添加(適應範圍,以滿足您的需求):

<!-- Bean Validation API and RI --> 
<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.0.0.GA</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.0.2.GA</version> 
    <scope>runtime</scope> 
</dependency> 

我沒有測試你的代碼,但是這將在最少修復你的POM。

PS:如果在類路徑中只有一個,則不需要在persistence.xml中指定持久性提供程序,則無需指定方言。但這不應該傷害。

PPS:請注意javax.persistence:persistence-api:jar:1.0是一個API,而不是一個實現,它本身不會做任何事情(我的意思是,它不是Hibernate,EclipseLink等的替代品)。

+0

非常感謝!有用!上帝保存了stackoverflow及其參與者! – 2010-04-24 00:32:17

+0

你怎麼知道哪個hibernate-validator對hibernate 3.5.1-Final有效? – Phil 2011-01-04 14:27:28

0

我在前輩沒有發現的一件重要的事情沒有提到,但似乎至關重要的是增加了休眠依賴提供的範圍。所以在戰爭/耳中,這些不會被添加。

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.5.1-Final</version> 
    <scope>provided</scope> 
</dependency> 

我花了我一段時間才發現這一點,所以我爲其他人指出了這一點。

+0

誰提供這個? – Reddy 2011-06-22 07:00:30

+1

通常應用程序服務器,在我的情況下是在./jboss-6.0.0/common/lib/hibernate-entitymanager.jar – 2011-06-22 12:57:04

3

如果你不使用Maven的依賴和使用僅僅是Eclipse類路徑設置,你只需要把上面的jar文件中的類路徑從休眠3.5及以上

1)冬眠核心罐

2)冬眠註解罐子

3)的JBoss測井罐子

4)冬眠實體管理器罐子

JPA AP我2. jar(它包含在hibernate發行版中)。

我有類似的問題,我用這種方法,它的工作。從同一版本的發行版中獲取所有依賴的jar是最好的主意。如果您發現任何錯誤,您可以從日誌中找到它並繼續將該jar放入類路徑