0

JSF と JPA には少し慣れていないので、Netbeans の自動生成コードに大きく依存して、エンティティ、ファサード、マネージド Bean を作成しています。通常の制約が適用された郡、国などに関連するいくつかのネストされた子テーブルを含む User テーブルがあります。

DataTable コンストラクトを使用して、データベース内のすべてのユーザーを表示する JSF ページの作成を開始するまで、すべてが順調に進んでいました。数値の FK 値を、子テーブルで参照されているテキスト データに置き換えようとしています。JSF フレームワークは、countryID フィールドが外部キーであることを「認識」しているため、デフォルトでこのデータを表示しますが、countryID には実際には Country オブジェクトが含まれているため、必要なデータが含まれていることがわかっています。CountryID によって参照される Country オブジェクトから CountryNAME フィールドを抽出して表示するための正しい EL 構文が見つからないようです。情報はそこにあると確信していますが、正しい質問をしているとは思いません...

ユーザー エンティティ (簡略化された抜粋):

@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>
...
4

1 に答える 1

-2

toStringCountry エンティティの () メソッドをオーバーライドします。デフォルトでは、Object のハッシュコードを返します。国名が必要な場合は、次のようにtoString()メソッドを設計します。

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

また、

countryNameEL式で呼び出します。

<h:outputText value="#{item.countryID.countryNAME}" />
于 2013-09-30T17:13:19.887 に答える