来自实体的JSF表单和外键问题

来自实体的JSF表单和外键问题,jsf,netbeans,Jsf,Netbeans,最近我做了[CRUD Enterprise Application in NetBeans][1]。我为它制作了自己的场景,即为玩家存储分数。我有三张牌桌,一张牌桌,一张牌桌和一张牌桌。在教程形式的youtube中,玩家和游戏表(添加、删除、编辑)的一切都很好,但我对链接表(playerGame)有问题。当我尝试使用netBeans调色板从实体生成JSF表单时,我得到了以下代码 我也试过这个 <h:selectOneMenu id="fkPlay

最近我做了[CRUD Enterprise Application in NetBeans][1]。我为它制作了自己的场景,即为玩家存储分数。我有三张牌桌,一张牌桌,一张牌桌和一张牌桌。在教程形式的youtube中,玩家和游戏表(添加、删除、编辑)的一切都很好,但我对链接表(playerGame)有问题。当我尝试使用netBeans调色板从实体生成JSF表单时,我得到了以下代码


我也试过这个

                    <h:selectOneMenu id="fkPlayerId" value="#{controller.player.playerId}" title="FkPlayerId" required="true" requiredMessage="The FkPlayerId field is required.">
                    <!-- TODO: update below reference to list of available items-->
                    <f:selectItems value="#{controller.player.playerGameList}"/>
                </h:selectOneMenu>

但是没有结果

playerId和gameId的外键应该由调色板输入的地方

我的问题是我必须做些什么来解决这个问题,在链接表上看到类似的例子会很好,但我没有发现任何东西(我只找到了一个简单的表示例)。我是JavaEE的新手,这是我在这个主题上的第一个教程,老实说,我不知道如何正确命名

我还试图找到解决问题的方法,从netbeans网站上下载JavaServer Faces教程。该教程非常简单,我对它没有任何问题,在相同的场景下也可以正常工作(我能够从下拉列表中选择外键并创建playerGame记录)。我曾尝试在本教程中基于JSF页面解决此问题,但这些页面是使用netBeans命令生成的,JSF页面是从实体类生成的,因为我没有像前面提到的那样使用JavaEE的经验,所以未能解决此问题

另外,如果您需要我提供更多信息,请尽管问

更新:

多亏了Geinmachi,它现在部分工作了

部分解决方案:

在我的控制器类中,我添加了

    private String playerList;

public String getPlayerList() {
    return playerList;
}

public void setPlayerList(String playerList) {
    this.playerList = playerList;
}



private List<Player> playerLists;

public List<Player> getPlayerLists() {
    return playerLists;
}

public void setPlayerLists(List<Player> playerLists) {
    this.playerLists = playerLists;
}


@PostConstruct
public void init(){
   playerLists = playerFacade.findAll();
    // playerLists = new ArrayList<>();
   // playerLists.add( new Player(player.getPlayerId()));
}
public void submit(){
    System.out.println("Selected Player: " + playerList);
}
私有字符串播放列表;
公共字符串getPlayerList(){
返回玩家列表;
}
public void setPlayerList(字符串playerList){
this.playerList=playerList;
}
私人名单玩家;
公共列表getPlayerLists(){
返回玩家名单;
}
public void setPlayerLists(列表playerLists){
this.playerLists=playerLists;
}
@施工后
公共void init(){
playerLists=playerFacade.findAll();
//playerLists=newarraylist();
//添加(新播放器(Player.getPlayerId());
}
公开作废提交(){
System.out.println(“所选玩家:“+playerList”);
}
我的jsf代码看起来像

                    <h:selectOneMenu  value="#{controller.playerList}">
                    <f:selectItem itemValue="#{null}" itemLabel="#{player.playerName}"/>
                    <f:selectItems value="#{controller.playerLists}" var="player" itemValue="#{player.playerId}" itemLabel="#{player.playerName}"/>
                </h:selectOneMenu>

在Geinmachi提供的一个链接中找到了

但是现在我得到了
javax.ejb.EJBException:事务中止

尝试将数据插入数据库时,因为部分解决方案未获得fk_game_id。

PlayerGame
实体中给定字段(带getter/setter)

  • 私人玩家fkPlayerId
  • 私人游戏fkGameId
在控制器中:

  • private List playerList
  • 私人列表游戏列表
表格:


在控制器中,您需要所有玩家和所有游戏的列表以供选择。您必须为实体创建转换器,因为在HTML页面上它们只是
String
,JSF需要
Player
Game
对象。对于POJO JSF转换器,您可以在google中搜索并阅读

请参见:


在my PlayerGame.java中,我有一个私人播放器fkPlayerId。你的意思是这个字段等等?是的,在这种情况下你需要转换器。我确实发现还有一个getDiscountCodes方法,所以我必须在我的控制器类中创建类似的东西,对吗?不,你不必。您只需将
列表
绑定到
,无需创建编程模型。更新了我的答案。如果您在
h:selectOneMenu
中有entites,您需要converter,那么在google中搜索“jsf converter”时,您应该可以找到大量的示例。
<h:form>
        <h:outputText value="Choose player"/>
        <h:selectOneMenu value="#{controller.playerGame.fkPlayerId}" converter="playerConverter">
            <f:selectItems value="#{controller.playerList}" var="player" 
                           itemValue="#{player}" itemLabel="#{player.playerName}"/>
        </h:selectOneMenu>
        <h:outputText value="Choose Game"/>
        <h:selectOneMenu value="#{controller.playerGame.fkGameId}" converter="gameConverter">
            <f:selectItems value="#{controller.gameList}" var="game" 
                           itemValue="#{game}" itemLabel="#{game.gameName}"/>
        </h:selectOneMenu>
        <h:commandButton action="#{controller.createPlayerGame}" value="Link player with a game"/>
    </h:form>