2013-11-22 109 views
2

人只能有一辆车,但在数据表我要显示在列表中的所有汽车,但选择一个用户个人所属。这样用户可以即时更新任何人的汽车。JSF Primefaces selectOneMenu用于

让说,我有两个tables

Person

id 
name 
car_id 

Cars

id 
name 

理想的情况下,person应该有Cars id作为primary关键,但事实并非如此。所以每个人都有车,对。

现在我在显示数据表例如中person名单

------------------------------------ 
Name | Car 
---------------------------------------- 
ABC | 1 
DDD | 2 

但是我想表明这样的:

------------------------------------ 
Name | Car 
---------------------------------------- 
ABC | Toyota 
DDD | Ford 

现有代码:

<p:dataTable value="#{test.persons} var="person"> 
    <p:column headerText="Name"> 
     #{person.name} 
    </p:column> 
    <p:column headerText="Name"> 
     #{person.carID} 
    </p:column> 
</p:dataTable> 

但我想要做的事,如:

<p:dataTable value="#{test.persons} var="person"> 
    <p:column headerText="Name"> 
     #{person.name} 
    </p:column> 
    <p:column headerText="Car"> 
     <p:selectOneMenu value="#{test.selectedCar}" 
      converter="entityConverter"> 
      <f:selectItems value="#{spMBean.cars}" var="car" 
       itemLabel="#{car.name}" itemValue="#{car}" /> 
     </p:selectOneMenu> 
    </p:column> 
</p:dataTable> 

如果有人能帮助我,我会非常感谢。

+0

您是否使用了一些像Hibernate一样的ORM工具? “理想情况下,人应该将Cars ID作为主键,但事实并非如此。所以每个人都有车,对。我不明白这个说法,我认为你的模型是正确的。 –

+0

是的,我正在使用JPA Hibernate。其实,我有类似的表,即使Person有车号,但它没有Cars表的主键作为foriegn键。我知道数据库设计是不正确的。 – Makky

+1

该模型否认一个人拥有多辆汽车的可能性,这是否是所期望的?我相信你的车型需要更加精致... –

回答

2

要关联选定的车与个人。

但是,您将下拉值绑定到通用支持bean属性而不是invidivual个人。同一数据表中所有这些行中的所有下拉列表现在都指向同一个支持bean属性。提交后,每一行的选定值将相互覆盖,直到backing bean属性以最后一行的选定值结束。

这没有意义。您需要将下拉值绑定到个人。

<p:selectOneMenu value="#{person.car}"> 

这是最简单的,如果Person实体有private Car car属性,而不是一个private Long carID。你当然可以把可用的项目保存在一个单独的bean中。

+0

这是有道理的。谢谢。 – Makky

+0

人没有私人汽车汽车,但有私人长汽车ID。 – Makky

+0

然后,您需要将''更改为'#{car.id}'并移除转换器。你目前的代码即期望有一个'Car'属性。真的,我只是在这里用一个'@ OneToOne'和一个真正的'Car'属性,而不是一个ID。 – BalusC

1

有几个选项。

首先,你可以更改成员在Person()类采取的Car一个实例,而不是carIdinteger的:

public class Person { 

    private String name; 
    private Car car; 
    } 

所以,那么你的dataTable看起来是这样的:

<p:dataTable value="#{test.persons} var="person"> 

         <p:column headerText="Name"> 
          <h:outputText value="#{person.name}" /> 
          </p:column> 

         <p:column headerText="Car"> 
          <h:outputText value="#{person.car.model}" /> 
          </p:selectOneMenu> 
         </p:column> 
        </p:dataTable> 

...假设Car pojo如:

public class Car { 

private String make; 
private String model; 
} 

第二个是,你可以添加一个getCarById()方法来支撑bean,并在DataTable使用它。

所以,在你的页面:

<p:dataTable value="#{test.persons} var="person"> 

        <p:column headerText="Name"> 
         <h:outputText value="#{person.name}" /> 
         </p:column> 

        <p:column headerText="Car"> 
         <h:outputText value="#{myBean.getCarById(person.carId).model}" /> 
         </p:selectOneMenu> 
        </p:column> 
       </p:dataTable> 

,并在您的支持bean:

public Car getCarById(int carId) { 
for(Car c: getAllMyCars() { 
if(c.carId == carId) { 
    return c; 
} 
return null; 
} 

再次,假设Car POJO如:

public class Car { 

private String make; 
private String model; 
} 
+0

感谢您的回答。但是我想在列表中显示所有可用的汽车,并选择当前拥有的汽车。我已经更新了这个问题。 – Makky

2

基于BalusC的答案。这是解决方案。

<p:dataTable value="#{test.persons} var="person"> 
    <p:column headerText="Name"> 
     #{person.name} 
    </p:column> 
    <p:column headerText="Car"> 
     <p:selectOneMenu value="#{person.carID}"> 
      <f:selectItems value="#{spMBean.cars}" var="car" 
       itemLabel="#{car.name}" itemValue="#{car.id}" /> 
     </p:selectOneMenu> 
    </p:column> 
</p:dataTable> 

它会列出汽车的名字,但显示一个人有一个。

谢谢你的回答。

+0

'itemValue'错误。它应该是'#{car.id}'。 – BalusC

+0

谢谢,更新。 – Makky