2013-06-30 59 views
0

我正在開發Web項目EJB,JPA - Hibernate作爲提供者,JBoss 6,MySql。 我是EJB中的新成員,JPA.I在servlet中加載ejb bean時遇到問題。EJB - JPA - Hibernate - JBoss 6-MySql

的persistence.xml

<persistence-unit name="LibraryPersistenceUnit" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:/MySqlDS</jta-data-source> 
    <class>library.entity.User</class> 
    <class>library.entity.Book</class> 
    <properties> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
    </properties> 

</persistence-unit> 

UserFacade.java

@Local 
public interface UserFacade { 
    User findUserByLoginAndPassword(String login, String password); 

    /* List<User> getClients(); 

    void returnBooks(long userId, long[] ids); 

    void takeBooks(long userId, long[] ids);*/ 
} 

UserFacadeImpl.java

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); 
    }*/ 
} 

UserDAO.java

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); 
    }*/ 
} 

GenericDAO.java 包library.dao.interfaces;

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); 
    } 
} 

我得到userFacade.Can你給我解釋一下什麼空我做錯了。 謝謝。

+0

FYI更好地使用最新的JBoss AS 7,如果你願意,以應付一些粗糙的邊緣(即使用alpha版本),您可以嘗試更名爲新一代JBoss AS服務器的wildfly。就我所知,版本6不再被維護。 – akostadinov

+0

我讀過它。但問題,我不知道如何獲得EntityManager – KarzhouAndrew

回答

0

的問題是,而不是讓容器來實例化注入DAO你,你明確地定義自己創建的DAO實例:

private IUserDAO dao; 
public UserService() { 
    dao = UserDAOImpl.getInstance(); 
} 

對於EntityManager而注入DAO,容器必須實例化它,而不是你。替換爲以下,它使用依賴注入上面的代碼,從而也將有可能使你的代碼可測試的優勢:

@Inject 
private IUserDAO dao; 
+0

它沒有幫助 – KarzhouAndrew

+0

向我們顯示您的更新代碼。讓我們看看如何從控制器獲取對服務EJB的引用,並從您的服務中引用您的DAO。 –

+0

我使用Command模式並通過operator new創建UserService。 – KarzhouAndrew