【问题标题】:JSF Primefaces SelectOneMenuJSF Primefaces SelectOneMenu
【发布时间】:2013-11-22 14:10:35
【问题描述】:

Person 只能拥有一辆车,但在数据表中,我想显示列表中的所有汽车,但选择 person 所属的一个用户。这样用户就可以随时更新任何人的汽车。

假设我有两个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>

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 你在使用像 Hibernate 这样的 ORM 工具吗? Ideally , person should have Cars id as primary key but that is not the case. So each person has car ,right.这个说法我没看懂,我觉得你的模型是对的。
  • 是的,我正在使用 JPA Hibernate。实际上,我有类似的表,即使 Person 有汽车 ID,但它没有 Cars 表的主键作为外键。我知道数据库设计不对。
  • 该模型否认一个人拥有不止一辆汽车的可能性,这是理想的吗?我相信你的模型需要更加完善......
  • 没错,一个人应该只有一辆车,但我希望用户能够从下拉列表框中更改汽车。
  • 如果每个人只有一辆车,则车型正确。

标签: jsf primefaces datatable selectonemenu


【解决方案1】:

您希望将所选汽车与个人相关联。

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

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

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

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

【讨论】:

  • 这是有道理的。谢谢。
  • 个人没有私家车车,但有私长车ID。
  • 那么您需要将&lt;f:selectItems itemValue&gt; 更改为#{car.id} 并移除转换器。您当前的代码即需要 Car 属性。真的,我在这里只使用 @OneToOne 和真正的 Car 属性,而不仅仅是一个 ID。
  • 感谢 BalusC。你是最好的。我设法对其进行了排序。谢谢。
【解决方案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>

它将列出汽车名称,但显示一个人拥有的汽车名称。

感谢大家的回答。

【讨论】:

    【解决方案3】:

    有几个选项。

    第一个是您可以更改Person() 类中的成员以获取Car 的实例,而不是integer 的integer:

    public class Person {
    
        private String name;
        private Car car;
        }
    

    那么你的数据表可能如下所示:

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

    【讨论】:

    • 感谢您的回答。但我想在列表中显示所有可用的汽车并选择当前拥有的汽车。我已经更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 2013-11-30
    • 2021-03-03
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多