使用EJB和JPA持久化到数据库时遇到问题

时间:2013-09-06 08:19:50

标签: java jpa nullpointerexception ejb

这是实体

  package com.ose.bookstore.model.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 * Entity implementation class for Entity: Login
 *
 */
@Entity
public class Login implements Serializable {


    private static final long serialVersionUID = 1L;

    public Login() {
        super();
    }
    @Id
    @GeneratedValue
    private int loginId;
    private String userEmail;
    private String password;
    private String secPassword;



    public String getUserEmail() {
        return userEmail;
    }
    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSecPassword() {
        return secPassword;
    }
    public void setSecPassword(String secPassword) {
        this.secPassword = secPassword;
    }
    public int getLoginId() {
        return loginId;
    }
    public void setLoginId(int loginId) {
        this.loginId = loginId;
    }
}

这是控制器/测试类

package com.ose.bookstore.model.test;

import javax.ejb.EJB;
import javax.faces.bean.SessionScoped;

import com.ose.bookstore.model.ejb.LoginDao;
import com.ose.bookstore.model.entity.Login;

/**
 * @author nishant
 * 
 */
@SessionScoped
public class LoginTest1 {

    @EJB
    private static LoginDao loginDao;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Login login = new Login();
            login.setLoginId(2);
        login.setPassword("asdf");
        login.setSecPassword("asdfsadF");
        login.setUserEmail("email");
        loginDao.writeToDb(login);
    }
}

这是EJB类

package com.ose.bookstore.model.ejb;

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.ose.bookstore.model.entity.Login;

/**
 * @author nishant
 *
 */
@Remote
@Stateless
public class LoginDao {

    public LoginDao() {
        super();
        // TODO Auto-generated constructor stub
    }
    @PersistenceContext
    private EntityManager entityManager; 
    public void writeToDb(Login login){
        entityManager.persist(login);
    }

}

我收到此错误loginDao.writeToDb(登录);

线程“main”java.lang.NullPointerException中的异常     在com.ose.bookstore.model.test.LoginTest1.main LoginTest1是Controller / Test类的类名

2 个答案:

答案 0 :(得分:1)

您需要在Application client container内执行客户端代码。否则@EJB本地注入不起作用(您的测试代码像javastandalone一样执行,但它需要一个注入EJB的Container)

答案 1 :(得分:0)

您需要创建一个公开业务方法的远程/本地接口。

ejb客户端应用程序将使用此接口。

如果ejb客户端位于要部署ejb会话bean的相同环境中,请使用@Local批注。

如果ejb客户端位于要部署ejb会话bean的不同环境中,请使用@Remote注释。

@Remote
public interface LoginDaoRemote {
   public void writeToDb(Login login);
}

@Stateless
public class LoginDao implements LoginDaoRemote {

@Override
public void writeToDb(Login login){
    entityManager.persist(login);
  }
}