2015-03-21 2 views
0

Мой код EJB:JPA EntityManager NullPointer исключение (которое не должно быть !?)

@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 банки в своем классе пути.

Вот мои объектные компоненты:

@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 + "]"; 
    } 
} 

Что, кажется, проблема? может ли кто-нибудь помочь? Ив понял это из дня.

Проблема решена: я не должен использовать ресурс локально, потому что я запускал его на сервере приложений. Все равно, спасибо за помощь. хорошо оценено

ответ

0

У вас нет <provider> в вашем persistence.xml .. Попробуйте добавить его.

Ex:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> или <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> или <provider>org.hibernate.ejb.HibernatePersistence</provider> в зависимости от вашего контейнера.

НТН

+0

спасибо плохой попытке. является ли «org.eclipse.persistence.jpa.PersistenceProvider» встроенным в eclipse? нет необходимости добавлять дополнительную банку в мой путь к классу? –

+0

нет .. это реализуется EclipseLink .. Вы, возможно, потребуется добавить банку или Maven зависимость '' ' \t org.eclipse.persistence \t org.eclipse.persistence.jpa \t 2.6.0 '' ' –

+0

@lecarpetrondookmarion это работает ??? –

3

При установке transaction-type="RESOURCE_LOCAL" в persistence.xml конфигурационном файле, это означает, что вы (код = вашего приложения) будет заботиться о создании EntityManager, а также будет обрабатывать транзакции самостоятельно. В таком случае то, что вы можете потребовать для ввода вашего базового контейнера, - EntityManagerFactory, и вы можете сделать это, используя аннотацию @PersistenceUnit. На таком объекте вы просто вызываете createEntityManager(), что дает вам EntityManager.

Если вы хотите использовать EntityManager, указанный в контейнере, вы должны указать transaction-type="JTA". Затем вы комментируете EntityManager точно так же, как в своем коде, и не заботитесь о создании, совершении или откате транзакции. Это будет сделано контейнером, который будет использовать транзакцию JTA и решить, когда ее создавать, совершать или откатывать.

этих двух способов, как правило, известен как соответственно Application Managed EntityManager и контейнера Управляемой EntityManager

Вы можете найти более подробную информацию о том, как работать с каждым из двух способов обработки транзакций here или here

+0

Отличное объяснение –

Смежные вопросы