2013-11-22 5 views
2

У человека может быть только один автомобиль, но в datatable я хочу отобразить все автомобили в списке, но выберите одного пользователя. Таким образом, пользователь может обновить автомобиль любого человека на лету.JSF Primefaces SelectOneMenu

Пусть говорят, у меня есть два tables

Person

id 
name 
car_id 

Cars

id 
name 

В идеале person должен иметь Cars идентификатор в качестве primary ключа, но это не так. Поэтому у каждого человека есть машина, верно.

Теперь я показываю список person в datatable, например.

------------------------------------ 
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

Вы используете какой-то инструмент ORM, например Hibernate? «В идеале, человек должен иметь идентификатор автомобилей как первичный ключ, но это не так. Поэтому у каждого человека есть машина, правильно. «Я не понимаю этого утверждения, я думаю, что ваша модель правильная. –

+0

Да, я использую JPA Hibernate. На самом деле, у меня есть похожие таблицы, хотя у человека есть идентификатор автомобиля, но у него нет первичного ключа таблицы Cars в качестве ключа foriegn. Я знаю, что дизайн базы данных неверен. – Makky

+1

Модель лишает человека возможности иметь более одного автомобиля, это желательно? Я считаю, что ваша модель должна быть более утонченной ... –

ответ

2

Вы хотите связать выбранный автомобиль с отдельным человеком.

Однако вы привязываете выпадающее значение к общей базе данных bean-свойства, а не к invidivual person. Все эти выпадающие списки во всех этих строках в одной и той же таблице данных теперь указывают на одно и то же свойство бэк-компонента. При отправке выбранное значение каждой отдельной строки будет переопределять друг друга до тех пор, пока свойство bean bean-компонента не закончится с выбранным значением последней строки.

Это не имеет смысла. Вам нужно привязать выпадающее значение к отдельному человеку.

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

Это проще, если Person объект имеет свойство private Car car вместо private Long carID. Конечно, вы можете хранить доступные предметы в отдельном компоненте.

+0

Это имеет смысл. Благодарю. – Makky

+0

Лицо не имеет частного автомобиля, но имеет частный длинный автомобиль. – Makky

+0

Тогда вам нужно будет изменить '' на '# {car.id}' и удалить конвертер. В вашем текущем коде есть свойство 'Car'. На самом деле, я просто использовал бы «@ OneToOne» здесь с реальным свойством «Car», а не только с идентификатором. – BalusC

1

Есть несколько вариантов.

Первое, что вы могли бы изменить элемент в вашем Person() классе взять экземпляр Car вместо integer из carId:

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() к вашему бэк-файлу и использовать его в 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> 

и в вашем бэк-боба:

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

Смежные вопросы