EJB-JPA-Hibernate-JBoss 6-MySql

EJB-JPA-Hibernate-JBoss 6-MySql,mysql,dependency-injection,jpa-2.0,ejb-3.0,jboss6.x,Mysql,Dependency Injection,Jpa 2.0,Ejb 3.0,Jboss6.x,我正在开发web项目EJB,JPA-Hibernate作为提供者,JBoss6,MySql。 我是EJB的新手,JPA。我在servlet中加载EJB bean时遇到问题 persistence.xml 我的userFacade为空。你能解释一下我做错了什么吗。 谢谢。问题在于,不是让容器为您实例化和注入DAO,而是您自己显式地创建DAO实例: private IUserDAO dao; public UserService() { dao = UserDAOImpl.getInst

我正在开发web项目EJB,JPA-Hibernate作为提供者,JBoss6,MySql。 我是EJB的新手,JPA。我在servlet中加载EJB bean时遇到问题

persistence.xml

我的userFacade为空。你能解释一下我做错了什么吗。
谢谢。

问题在于,不是让容器为您实例化和注入DAO,而是您自己显式地创建DAO实例:

private IUserDAO dao;
public UserService() {
    dao = UserDAOImpl.getInstance();
}
要将EntityManager注入DAO,容器必须实例化它,而不是您。将上述代码替换为使用依赖项注入的以下代码,这样还具有使代码可测试的优点:

@Inject
private IUserDAO dao;

仅供参考,最好使用最新的JBoss AS 7,或者如果您愿意处理一些粗糙的边缘(即使用alpha版本),您可以尝试wildfly,它是重命名的新一代JBoss AS服务器。据我所知,第6版不再被维护。我读到了。但问题是我不知道如何让EntityManager向我们展示更新的代码。向我们展示如何从控制器获取对服务EJB的引用,以及如何从服务获取对DAO的引用。我使用命令模式并通过操作员new创建UserService。这就是问题所在。容器只能注入它实例化的对象。不是你自己实例化的对象。好的,我如何解决这个问题?我应该如何创建entityManager和EntityManagerFactory?你应该使用依赖项注入,停止自己创建对象。将服务EJB注入servlet,并将DAO注入服务。
package library.facades.impl;

import library.dao.impl.UserDAO;
import library.entity.User;
import library.facades.interfaces.UserFacade;

import javax.ejb.EJB;
import javax.ejb.Stateless;

@Stateless
public class UserFacadeImpl implements UserFacade {

    @EJB
    private UserDAO userDAO;

    public UserFacadeImpl() {
    }

    public User findUserByLoginAndPassword(String login, String password) {
        User user = userDAO.selectUserByLoginAndPassword(login, password);
        return user;
    }

 /*   public List<User> getListClients() {
        List<User> userList = userDAO.getClients();
        return userList;
    }

    public void returnBooks(long userId, long[] ids) {
        userDAO.returnBooks(userId, ids);
    }

    public void takeBooks(long userId, long[] ids) {
        userDAO.takeBooks(userId, ids);
    }*/
}
package library.dao.impl;


import library.dao.interfaces.GenericDAO;
import library.entity.User;

import javax.ejb.Local;
import javax.ejb.Stateless;
import java.util.HashMap;
import java.util.Map;


@Stateless
public class UserDAO extends GenericDAO {


    public UserDAO() {
        super(User.class);
    }

    public User selectUserByLoginAndPassword(String login, String password) {
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("login", login);
        parameters.put("password", password);
        return (User) super.findOneResult(User.SELECT_USER_BY_LOGIN_AND_PASSWORD, parameters);
    }

    /*public List<User> getClients() {
        Query namedQuery = entityManager.createNamedQuery(User.ALL_CLIENTS, User.class);
        List<User> clientsList = namedQuery.getResultList();
        return clientsList;
    }

    @Override
    public void returnBooks(long userId, long[] ids) {
        User user = entityManager.find(User.class, userId);
        for (long id : ids) {
            Book book = entityManager.find(Book.class, id);
            user.getTakenBooks().remove(book);
        }
        entityManager.merge(user);
    }

    @Override
    public void takeBooks(long userId, long[] ids) {
        User user = entityManager.find(User.class, userId);
        for (long id : ids) {
            Book book = entityManager.find(Book.class, id);
            user.getTakenBooks().add(book);
        }
        entityManager.merge(user);
    }*/
}
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;
import java.util.Map;

public abstract class GenericDAO<T> {
    private static final String LIBRARY_PERSISTENCE_UNIT = "LibraryPersistenceUnit";

    @PersistenceContext(unitName = LIBRARY_PERSISTENCE_UNIT)
    private EntityManager entityManager;

    private Class<T> entityClass;

    public GenericDAO() {
    }

    public GenericDAO(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    public void save(T entity) {
        entityManager.persist(entity);
    }

    protected void delete(Object id, Class<T> classe) {
        T entityToBeRemoved = entityManager.getReference(classe, id);
        entityManager.remove(entityToBeRemoved);
    }

    public T update(T entity) {
        return entityManager.merge(entity);
    }

    public T find(int entityID) {
        return entityManager.find(entityClass, entityID);
    }

    // Using the unchecked because JPA does not have a
    // entityManager.getCriteriaBuilder().createQuery()<T> method
    @SuppressWarnings({"unchecked", "rawtypes"})
    public List<T> findAll() {
       /* CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));*/
        return null;//entityManager.createQuery(cq).getResultList();
    }

    // Using the unchecked because JPA does not have a
    // ery.getSingleResult()<T> method
    @SuppressWarnings("unchecked")
    protected T findOneResult(String namedQuery, Map<String, Object> parameters) {
        T result = null;

        try {
            Query query = entityManager.createNamedQuery(namedQuery);

            // Method that will populate parameters if they are passed not null and empty
            if (parameters != null && !parameters.isEmpty()) {
                populateQueryParameters(query, parameters);
            }

            result = (T) query.getSingleResult();

        } catch (Exception e) {
            System.out.println("Error while running query: " + e.getMessage());
            e.printStackTrace();
        }

        return result;
    }

    private void populateQueryParameters(Query query, Map<String, Object> parameters) {

        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}
package library.controller;

import library.entity.User;
import library.facades.interfaces.UserFacade;
import library.resourses.constants.Constants;
import library.resourses.enums.Role;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class LibraryController extends HttpServlet {

    @EJB
    private UserFacade userFacade;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        performAction(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        performAction(request, response);
    }

    private void performAction(HttpServletRequest request, HttpServletResponse response) {
        String pageType = request.getParameter(Constants.PAGE_TYPE);
        if (pageType != null) {
            try {
                String page = null;
                String login = request.getParameter(Constants.USER_LOGIN);
                String password = request.getParameter(Constants.USER_PASSWORD);
                User user = userFacade.findUserByLoginAndPassword(login, password);
                if (user == null) {
                    request.getSession().setAttribute(Constants.ERROR,
                            Constants.ERROR_MESSAGE_7);
                    page = Constants.MAIN_PAGE;
                } else {
                    String namePage = user.getRole().toString().toLowerCase();
                    if (isClient(user)) {
                        request.getSession().setAttribute(Constants.CLIENT,
                                user);
                        request.getSession().setAttribute(Constants.ERROR, null);
                    } else if (isAdministrator(user)) {
                        request.getSession().setAttribute(Constants.ADMINISTRATOR,
                                user);
                        request.getSession().setAttribute(Constants.ERROR, null);
                    }
                    page = Constants.START_PAGES + namePage + Constants.END_PAGES;
                }
                RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher(page);
                requestDispatcher.forward(request, response);
            } catch (ServletException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private boolean isAdministrator(User user) {
        return user.getRole().equals(Role.ADMINISTRATOR);
    }

    private boolean isClient(User user) {
        return user.getRole().equals(Role.CLIENT);
    }
}
private IUserDAO dao;
public UserService() {
    dao = UserDAOImpl.getInstance();
}
@Inject
private IUserDAO dao;