JPA EntityManager Nullpointer异常(不应该是!?)

时间:2015-03-21 10:56:19

标签: jpa entitymanager

我的ejb代码:

@Stateless
public class EmployeeBean {

      @PersistenceContext(unitName="Eclipselink_JPA")
      private EntityManager entitymanager;


      public void createEmployee(){
          Employee employee = new Employee( ); 
          employee.setEid( 1201 );
          employee.setEname( "Gopal" );
          employee.setSalary( 40000 );
          employee.setDeg( "Technical Manager" );

          entitymanager.persist( employee );
          entitymanager.getTransaction( ).commit( );

          entitymanager.close( );

      }
}

基本上,nullpointer异常发生在调用entitymanager.persist的行上,这不应该发生吗?

我的persistence.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.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_2_0.xsd">

   <persistence-unit name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL">

      <class>com.jpa.beans.Employee</class>

      <properties>
         <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:E:\HQLDB_AJ"/>
         <property name="javax.persistence.jdbc.user" value="sa"/>
         <property name="javax.persistence.jdbc.password" value="password"/>
         <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>
         <property name="eclipselink.logging.level" value="FINE"/>
         <property name="eclipselink.ddl-generation" value="create-tables"/>
      </properties>

   </persistence-unit>
</persistence>

我的课程路径中有eclipselink.jar和其他eclipselink jpa jar。

这是我的实体bean:

@Entity
@Table
public class Employee {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)  

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }

   public void setEid(int eid) {
      this.eid = eid;
   }

   public String getEname( ) {
      return ename;
   }

   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }

   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }

   public void setDeg(String deg) {
      this.deg = deg;
   }

   @Override
   public String toString() {
      return "Employee [eid=" + eid + ", ename=" + ename + ", salary=" + salary + ", deg=" + deg + "]";
   }
}

什么似乎是问题?有人可以帮忙吗?我一直在想这一天。

问题解决了:我不应该使用本地资源,因为我在app服务器上运行它。谢谢你的帮助。非常感谢

2 个答案:

答案 0 :(得分:3)

transaction-type="RESOURCE_LOCAL"配置文件中设置persistence.xml时,这意味着您(=您的应用程序代码)将负责创建EntityManager并自行处理事务。在这种情况下,您可以要求由底层容器注入的内容为EntityManagerFactory,您可以使用@PersistenceUnit注释来执行此操作。在这样的对象上,您只需致电createEntityManager()即可获得EntityManager

如果要使用容器提供的EntityManager,则必须指定transaction-type="JTA"。然后,您完全按照代码注释EntityManager,而不关心创建,提交或回滚事务。它将由将使用JTA事务的容器完成,并决定何时创建,提交或回滚它。

这两种方式通常分别称为 Application Managed EntityManager Container Managed EntityManager

您可以找到有关如何使用处理交易的两种方式herehere

的更多详细信息

答案 1 :(得分:0)

你的persistence.xml中没有<provider>。尝试添加它。

例如:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider><provider>org.hibernate.ejb.HibernatePersistence</provider> 取决于你的容器。

HTH