我正在尝试在网页中注入实体列表,以使用组合框设置另一个实体的字段。
我有一个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>
我可以通过在管理实例时禁用组合框来使其工作,但我想知道执行此操作的最佳方法是什么。
答案 0 :(得分:0)
if (carId != null){
应该是if (carId == null){