我可以将一个POJO注入BackingBean吗?还有@Entity到POJO?它是如何工作的?

时间:2013-06-13 23:10:50

标签: java jsf java-ee ejb cdi

所以这是我的代码:

<h:form>
    <p:dataTable var="customer" value="#{customersTableBackingBean.allCustomers}">
        <p:column headerText="First Name">
            <h:outputText value="#{customer.contactFirstName}" />
        </p:column>

        <p:column headerText="City">
            <h:outputText value="#{customer.city}" />
        </p:column>
    </p:dataTable>
</h:form>

BackingBean:

package com.tugay.maythirty.model;

import javax.inject.Inject;
import javax.inject.Named;
import java.io.Serializable;
import java.util.List;

@Named
public class CustomersTableBackingBean implements Serializable {

    @Inject
    CustomersService customersService;

    public List<Customers> getAllCustomers(){
        return customersService.getAllCustomers();
    }

    public String sayHello(){
        return "Hello from a managed bean!";
    }
}

服务:

import javax.inject.Inject;
import java.io.Serializable;
import java.util.List;

public class CustomersService implements Serializable {

    @Inject
    private CustomersDao customersDao;

    public List<Customers> getAllCustomers(){
        boolean userLoggedIn = true;
        if(userLoggedIn){
            return customersDao.getAllCustomers();
        }
        else{
            return null;
        }
    }
}

道:

import javax.persistence.*;
import java.util.List;

public class CustomersDao {

    @PersistenceContext(unitName = "Persistence")
    private EntityManager em;

    public List<Customers> getAllCustomers() {
        TypedQuery<Customers> query = em.createQuery("SELECT c FROM Customers c", Customers.class);
        List<Customers> allCustomers = query.getResultList();
        return allCustomers;
    }

    public void addCustomer(String customerName, String city){
        Customers customer = new Customers();
        customer.setCustomerName(customerName);
        customer.setCity(city);
        em.persist(customer);
    }
}

实体:

@Entity
public class Customers {
    //relevant code here...

所以这在Glassfish服务器上运行,运行得很好..我可以从数据库中获取数据并在index.xhtml上查看..

我的支持意思是@Named bean。因此@Named可以从EL访问它。

但是,它没有任何其他注释,例如Statless或Stateful .. 那么这个支持bean的“状态”是什么?这个bean的生命周期是不是由容器管理的?

另外,正如你所看到的那样,我正在使用@Inject向我的BackingBean注入一个服务,为我的服务注入一个Dao,为我的Dao注入一个实体......这些是EJB吗?如果他们像这样工作得很好,我为什么要制作这些@Stateless或@Stateful?

为什么我应该/应该制作任何这些bean @Stateful或@Statless?

2 个答案:

答案 0 :(得分:4)

CustomersService只是一个POJO。如果使用@Stateful对其进行注释,那么它将是一个有状态的EJB(带有@Statless - 无状态EJB)。与POJO(不是EJB)不同,EJB由EJB容器管理,并且可以受益于EJB容器必须提供的工具(例如,容器管理的事务,安全性......)。

但是如果你不需要EJB容器提供的服务,那么我认为制作EJB是没有意义的。

  

那么这个支持豆的“状态”是什么?

IMO,这没有多大意义。我认为你的意思是bean的范围(例如请求,会话,应用程序......)。如果是这样,既然你没有为它指定任何范围,我认为它不会放在任何范围内。它将在需要时被实例化(例如,在这种情况下,它应该在每次请求页面时被实例化)。但是如果它是作用域,那么只要范围本身存在,bean的实例就会存在。例如为每个新请求实例化一个请求范围的bean。

Here is the tutorial for EJB

上面的教程链接适用于Java EE 6.感谢@Luiggi的Java EE 7 tutorial link

答案 1 :(得分:0)

根据CDI规范(抱歉在我的手机上,无法轻松查找该部分)没有任何上下文/范围注释,bean是DependantScoped,这意味着容器每次访问(或创建并设置)时都会创建一个新实例在包含bean上,类似于自己做new)。

关于实体的另一个问题,您应该为要在前端直接访问的每个实体创建一个生产者。如果不这样做,可能无法正确保存。