f:从不同的EntityManager填充的selectItems导致事务提交

时间:2013-08-27 15:58:12

标签: jsf-2 jpa-2.0 entitymanager jboss-weld

我正在尝试在网页中注入实体列表,以使用组合框设置另一个实体的字段。

我有一个RequestScoped bean来填充DB中的实体列表和一个ConversationScoped bean用于当前bean

我正在使用PersistenceContextType.EXTENDED,每次执行某些操作时,entityManager都会尝试保留通过ComboBox分配的实体。我认为这是因为实体是使用不同的EntityManager实例获得的。我对吗?实现这一目标的最佳方法是什么?我不想在每个Bean中填充该列表,我希望在Seam 2样式中使用ListBeans。

希望这可以澄清问题:

这是我的制片人

@Named("companyList")
@RequestScoped
@Stateful
public class CompanyList{

    @PersistenceContext(unitName="keysPU")
    private EntityManager entityManager;
    private List<Company> companies;

    @PostConstruct
    public void init(){
            companies = entityManager.createQuery("Select c from Company c").getResultList();
    }

    //getters, setter

}

这是我的ConversationScoped bean

@Named("car")
@ConversationScoped
@Stateful
public class CarBean(){

  private Integer carId;
  private boolean managed;
  @Inject Conversation conversation;
  @PersistenceContext(unitName="keysPU", type = PersistenceContextType.EXTENDED)
  private EntityManager entityManager;


  public void fetchCar(){ 
     if (!FacesContext.getCurrentInstance().isPostback()) {
           if (carId == null){
              car = new Car();
              managed = false;
           }
           else{
              car = entityManager.find(Car.class,carId);
              managed = true;
           }

         if (conversation.isTransient()){
             conversation.begin();
         }
      }
   }
}

这就是我在网页上的内容

<f:metadata>
    <f:viewParam name="carId" value="#{car.carId}"/>
    <f:event listener="#{car.fetchCar()}" type="preRenderView"/>
</f:metadata>

<h:outputText value="Company" />
<p:selectOneMenu value="#{car.car.company}" converter="#{companyConverter}" disabled="#{car.managed}">
    <f:selectItem noSelectionOption="true" itemLabel="Please select" itemValue="#{null}"/>                                          
    <f:selectItems value="#{companyList.companies}" var="_comp" itemValue="#{_comp}" itemLabel="#{_comp.name}" />                       
    <p:ajax update="car_details,save"/>
</p:selectOneMenu>

我可以通过在管理实例时禁用组合框来使其工作,但我想知道执行此操作的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

if (carId != null){应该是if (carId == null){