Сүзгі EntityManager қолданбасын инициализацияламайды

Мен ашық көріністі Көрініс үлгісінде қолдануға тырысамын, бірақ ManagedBean ішіндегі EntityManager пәрменін әр уақытта entityManager түрінде ұстауға тырысамын NULL мұнда қалай жасаймын:

package filters;

// imports..    


public class JPAFilter implements Filter {

    private EntityManagerFactory factory;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        EntityManager entityManager = this.factory.createEntityManager();
        request.setAttribute("entityManager", entityManager);
        entityManager.getTransaction().begin();

        chain.doFilter(request, response);

        try {
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
            throw new ServletException(e);
        } finally {
            entityManager.close();
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.factory = Persistence.createEntityManagerFactory("copadomundo");

    }

    @Override
    public void destroy() {
        this.factory.close();
    }

}

Және бұл менің ManagedBean:

package managedbeans;

// imports ..

@ManagedBean
public class PlayerBean {

    @ManagedProperty(value = "#{entityManager}")
    private EntityManager entityManager;

    private Player player = new Player();

    private Long teamID;

    private List players = new ArrayList();

    public void add() {
        TeamRepository selecaoRepository = new TeamRepository(this.entityManager);
        Team selecao = selecaoRepository.search(this.teamID);
        this.player.setTeam(selecao);

        PlayerRepository playerRepository = new PlayerRepository(this.entityManager);
        playerRepository.adiciona(this.player);

        this.player = new Player();
        this.players = null;
    }

    public void remove(Player player) {
        PlayerRepository repository = new PlayerRepository(this.entityManager);
        repository.remove(player);
        this.players = null;
    }

   //GETTERS AND SETTERS
    public List getPlayeres() {
        if (this.players == null) {

            PlayerRepository repository = new PlayerRepository(
                    this.entityManager);
            this.players = repository.getPlayeres();
        }
        return this.players;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

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

    public Player getPlayer() {
        return player;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public Long getTeamID() {
        return teamID;
    }

    public void setTeamID(Long teamID) {
        this.teamID = teamID;
    }

    public void setPlayeres(List players) {
        this.players = players;
    }
}

Және бұл менің web.xml:

<?xml version="1.0" encoding="UTF-8"?>

    WorldCup
    
        index.xhtml
    
    
        Faces Servlet
        javax.faces.webapp.FacesServlet
        1
    
    
        Faces Servlet
        *.xhtml
    
    
        LoginFilter
        jpa.LoginFilter
    
    
        LoginFilter
        Faces Servlet
    
    
        JPAFilter
        jpa.JPAFilter
    
    
        JPAFilter
        Faces Servlet
    
    
        java.lang.Exception
        /error.xhtml
    

Міне, бұл не болып жатыр?

UPDATE After searching in every place about JPA, Hibernate and EJB, finally I found a good tutorial about it (follow this order to understand what is been doing, okay ?):

Орнату және Eclipse және Oracle Glassfish 3.1 үшін MySQL теңшеу

Пайдаланушыны тіркеу формасын құру арқылы JSF 2.0

Деректерді растау және түрлендіру JSF 2.0

EJB пайдалану 3.0 және JPA 2.0 деректер базасының тұрақтылығы үшін

3

1 жауаптар

Бұл тек PlayerBean де сұранысқа ие болған жағдайда ғана жұмыс істейтін болады. Егер бұл ауқымды көрінсе, онда кез-келген қолмен жасалатын сұранымның атрибуттары еленбейді және бұл конструкцияға рұқсат етілмегендіктен енгізілмейді. Акцептордан гөрі бірдей немесе кең көлемдегі JSF басқарылатын сипатын ғана енгізуге болады.

Мен сіздің сұрағыңыздың тарихына негізделіп, Glassfish 3-ні қолданып жатқаныңызды білемін. Неліктен EJB-ны қолданасыз? Осылайша контейнер транзакциялардың өзі туралы алаңдатады және мұндай сүзгіні мүлдем алудың қажеті жоқ. EntityManager сілтемесін @PersistenceContext .

Бұл өте қарапайым. Келесі EJB класын жасаңыз:

@Stateless
public class PlayerService {

    @PersistenceContext
    private EntityManager em;

    public Player find(Long id) {
        return em.find(Player.class, id);
    }

    public List list() {
        return em.createQuery("SELECT p FROM Player p", Player.class).getResultList();
    }

    public void create(Player player) {
        em.persist(player);
    }

    public void update(Player entity) {
        em.merge(player);
    }

    public void delete(Player player) {
        em.remove(em.contains(player) ? player : em.merge(player));
    }

   //...
}

(Glassfish 3 қосымша конфигурациясы қажет емес)

Оны JSF басқарылатын бұршақпен келесі түрде пайдалануға болады:

@ManagedBean
@ViewScoped
public class PlayerBean {

    private List players;

    @EJB
    private PlayerService playerService;

    @PostConstruct
    public void init() {
        players = playerService.list();
    }

   //...
}
6
қосылды
Мен оны @BalusC алдым, рахмет mate, whoooooooooooooooooooooaaaaa! =] Ақырында.
қосылды автор Valter Silva, көзі
ашық сеанстағы көрініс үлгісі көрсетілім қабатында бөлек нысандарды пайдаланбау үшін пайдаланылады және осылайша ленивый инициалдан ерекшеліктер туралы алаңдамау керек.
қосылды автор JB Nizet, көзі