我有来自数据库的实体类,其中一个是具有
的连接表@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);
}
}
错误说整数无法转换为游戏
答案 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概念。