作为 JSF 和 JPA 的新手,我严重依赖 Netbeans 自动生成的代码来创建实体、外观和托管 Bean。我有一个 User 表,其中包含几个与县、国家/地区等相关的嵌套子表,并应用了通常的约束。
一切都很顺利,直到我开始创建一个 JSF 页来使用 DataTable 构造显示数据库中的所有用户。我正在尝试将数字 FK 值替换为子表中引用的文本数据。JSF 框架默认显示此数据,因为它"知道"countryID 字段是外键,但我知道 countryID 实际上包含一个 Country 对象,因此是我想要的数据。我似乎找不到正确的 EL 语法来从 CountryID 引用的国家/地区对象中提取和显示 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 管理的 Bean(摘录(:
@Named("userController")
@SessionScoped
public class UserController implements Serializable {
private User current;
private DataModel items = null;
@EJB
private jpa.session.UserFacade ejbFacade;
private PaginationHelper pagination;
private int selectedItemIndex;
...
public PaginationHelper getPagination() {
if (pagination == null) {
pagination = new PaginationHelper(10) {
@Override
public int getItemsCount() {
return getFacade().count();
}
@Override
public DataModel createPageDataModel() {
return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
}
};
}
return pagination;
}
....
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
(( 方法。默认情况下,它将返回 Object 的哈希代码。如果您想要国家/地区名称,请按如下方式设计您的toString()
方法。
@Override.
public String toString(){
return countryNAME;
}
或
在 EL 表达式中调用countryName
。
<h:outputText value="#{item.countryID.countryNAME}" />