我的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服务器上运行它。谢谢你的帮助。非常感谢
答案 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
的更多详细信息答案 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