在这个例子中如何实现实体转换器?

时间:2016-01-04 03:31:19

标签: java

我有来自数据库的实体类,其中一个是具有

的连接表
@JoinColumn(name = "fk_game_id", referencedColumnName = "game_id")
@ManyToOne(optional = false)
private Game fkGameId;

我想将游戏fkGameId(在自己的表中是Integer)转换为整数,这样我就可以构建像

这样的构造函数
  

public PlayerGame(Integer id,Integer fkGameId,Integer fkPlayerId){...}

我的问题是如何做到这一点?互联网上的例子对我来说是黑魔法我正在看这个例子link here但我无法弄清楚我在哪里创建这个转换器?里面的实体类?如何实际触发转换器在哪里做转换,在哪里插入代码可以有人回答这个问题??

更新:

我认为我需要以某种方式进行转换以解决此问题,我确实将公共游戏fkgameid更改为公共Integer fkgameid,但我收到验证错误,说我想将非实体作为实体值发送

在会话外观中我有这个由playerGame.getFKGameID引起的错误:

    private List<PlayerGameDetails> copyPlayerGamesToDetails(List<PlayerGame> playerGames) {
    List<PlayerGameDetails> list = new ArrayList<PlayerGameDetails>();
    Iterator i = playerGames.iterator();
    while (i.hasNext()) {
        PlayerGame playerGame = (PlayerGame) i.next();
        Integer fkgameid = (Integer) playerGame.getFkGameId();
        PlayerGameDetails details = new PlayerGameDetails(playerGame.getPlayerGameId(),
                playerGame.getPlayerGameScore(), playerGame.getFkGameId(), playerGame.getFkPlayerId());
        list.add(details);
    }
    return list;
} 
错误游戏

无法在g和p上转换为整数 还有这个:

    @Override
public void createPlayerGame(PlayerGameDetails details) {
    try {
        Integer g = (Integer) details.getFkGameId();
        Integer p = (Integer) details.getFkPlayerId();
        PlayerGame playerGame = new PlayerGame(details.getPlayerGameId(), details.getPlayerGameScore(), g, p);
        em.persist(playerGame);
    } catch (Exception ex) {
        throw new EJBException(ex);
    }
}

错误说整数无法转换为游戏

1 个答案:

答案 0 :(得分:0)

你不应该使用任何转换器。保持ManyToOne关联

假设你想为现有游戏和现有玩家创建一个PlayerGame,而不是定义

public PlayerGame(Integer id, Integer fkGameId, Integer fkPlayerId)

定义

    public PlayerGame(Integer id, Game game, Player player)

(虽然你的ID应该是自动生成的,因此不是构造函数的一部分)

而不是使用

PlayerGame pg = new PlayerGame(1, 2, 3);

使用

PlayerGame pg = new PlayerGame(1, 
                               entityManager.getReference(Game.class, 2),
                               entityManager.getReference(Player.class, 3));

请注意,如果游戏和玩家是该实体的唯一字段,则可以完全抛弃,并由玩家和游戏之间的ManyToMany关联取代。

我还会将字段fkGameId重命名为game。你拥有的不是一个ID,而是一个Game的实例。 fk代表外键,它是关系数据库概念,而不是OO概念。