java - Hibernate:将列映射到固定大小的映射
问题描述
我有一个实体对象,代表 4 个玩家的游戏,每个玩家坐在桌边,N,E,S或W之一。游戏存储在数据库中,如下所示:
CREATE TABLE game_slot (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
...
player_N VARCHAR(127) NOT NULL,
player_E VARCHAR(127) NOT NULL,
player_S VARCHAR(127) NOT NULL,
player_W VARCHAR(127) NOT NULL,
...
);
每列都声明为NOT NULL - 总是有 4 个玩家。
但是,我希望GameSlot
对象不是 4 个普通字段,而是具有单个players
字段,其中包含正好 4 个条目的映射。
public class GameSlot {
private int id;
private Map<String, String> players = new HashMap<>();
...
}
目前我通过为每个映射表列添加委托虚拟属性来实现这一点:
...
@JsonIgnore public String getPlayerN() { return this.players.get("N"); }
@JsonIgnore public String getPlayerE() { return this.players.get("E"); }
@JsonIgnore public String getPlayerS() { return this.players.get("S"); }
@JsonIgnore public String getPlayerW() { return this.players.get("W"); }
public void setPlayerN(String value) { this.players.put("N", value); }
public void setPlayerE(String value) { this.players.put("E", value); }
public void setPlayerS(String value) { this.players.put("S", value); }
public void setPlayerW(String value) { this.players.put("W", value); }
...
使用 xml 映射很简单:
<!-- GameSlot.hbm.xml -->
...
<property name="playerN" column="player_N" not-null="true" length="127" />
<property name="playerE" column="player_E" not-null="true" length="127" />
<property name="playerS" column="player_S" not-null="true" length="127" />
<property name="playerW" column="player_W" not-null="true" length="127" />
...
但是,这种方法似乎很尴尬,我想找到更好的解决方案。那么,如何将多个表列映射到单个映射中?一些正在发挥作用的条件:
- 受影响的列数固定 - 准确且始终为 4
- 每列不为空
- 物业 | 列类型都一样-
String
|varchar(127)
- 要使用的密钥是已知的、固定的并且都是相同类型的
- 我宁愿使用xml映射,但注释也可以。
解决方案
推荐阅读
- alembic - 如何在 alembic op.execute 中传递文件名变量?
- sql - 如何将此sql重写为sqlalchemy?
- c++ - C++ 部分特化友元声明——模板矩阵类
- python - 无法通过 anaconda 提示打开 jupyter notebook
- sharepoint - 根据文本字段在 Sharepoint 中设置下拉菜单的值
- excel - 在循环中复制范围内的非空白行
- python - Timeit.timeit 方法。哪种方式是正确的:内部还是外部?
- google-chrome-devtools - Chrome DevTools 远程调试器以不同方式显示颜色
- c - 为什么使用 %u 时我的 char 的二进制值会发生变化?
- ruby-on-rails - PG 搜索未返回预期记录