2013-11-22 112 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