2010-04-22 128 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放入类路径