Jsf 2 在数据表中使用JSF EL访问实体中的子表字段

Jsf 2 在数据表中使用JSF EL访问实体中的子表字段,jsf-2,datatable,el,Jsf 2,Datatable,El,作为JSF和JPA的新手,我非常依赖Netbeans自动生成的代码来创建实体、外观和托管bean。我有一个用户表,其中包含几个嵌套的子表,这些子表与县、国家等相关,并应用了通常的约束 一切进展顺利,直到我开始创建一个JSF页面,使用DataTable构造显示数据库中的所有用户。我试图用子表中引用的文本数据替换数值FK值。JSF框架默认显示这些数据,因为它知道countryID字段是一个外键,但我知道countryID实际上包含一个Country对象,因此包含我想要的数据。我似乎找不到正确的EL语

作为JSF和JPA的新手,我非常依赖Netbeans自动生成的代码来创建实体、外观和托管bean。我有一个用户表,其中包含几个嵌套的子表,这些子表与县、国家等相关,并应用了通常的约束

一切进展顺利,直到我开始创建一个JSF页面,使用DataTable构造显示数据库中的所有用户。我试图用子表中引用的文本数据替换数值FK值。JSF框架默认显示这些数据,因为它知道countryID字段是一个外键,但我知道countryID实际上包含一个Country对象,因此包含我想要的数据。我似乎找不到正确的EL语法来从CountryID引用的Country对象提取和显示CountryNAME字段。我确信信息是公开的,但我认为我问的问题不对

用户实体简化摘录:

@Entity
@Table(name = "Users")
@XmlRootElement
public class Users implements Serializable {
....=
    @JoinColumn(name = "Country_ID", referencedColumnName = "Country_ID")
    @ManyToOne(optional = false)
    private Country countryID;
...
国家实体简化:

@Entity
@Table(name = "Country")
@XmlRootElement
...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "Country_ID")
    private Integer countryID;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "Country_NAME")
    private String countryNAME;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "countryID")
    private Collection<User> userCollection;
...
JSF页面:

                    <h:dataTable value="#{userController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
 ...
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="#{bundle.ListUserTitle_countryID}"/>
                            </f:facet>
                            <h:outputText value="#{item.countryID.countryID}"/>
                        </h:column>
...
覆盖国家实体中的toString方法。默认情况下,它将返回对象的哈希代码。如果您想要国家名称,请按如下所示设计toString方法

@Override.
public String toString(){
   return countryNAME;
}
或者

在EL表达式中调用countryName

<h:outputText value="#{item.countryID.countryNAME}" />

真不敢相信我错过了!我已经重写了toString,但没有更改我的字段名。这就是在不了解自动生成代码实际功能的情况下使用自动生成代码所得到的结果。我花了两天时间想知道为什么item.countryID给了我一个Country对象,而不是对Country表的整数FK引用!需要注意的是,为了这个目的而覆盖toString是一种非常糟糕的做法,有问题的用户在宽限期内公然将我当前删除的答案复制粘贴到他的或部分中,而没有署名。“我的忽略列表现在比用户丰富了一倍。@BalusC-实际上我已经重写了字符串,以便在另一个视图用户编辑页面中提供以用户为中心的对象表示形式-否则,“选择通”列表框就没有多大意义了。我应该用不同的方式来实现这一点吗?出于好奇,为什么这是一个坏习惯?抱歉-完全是新手的问题,我确信我的印象是重写这个方法通常不会像hashCode或equals那样产生影响
<h:outputText value="#{item.countryID.countryNAME}" />