首页 > 解决方案 > Hibernate:将列映射到固定大小的映射

问题描述

我有一个实体对象,代表 4 个玩家的游戏,每个玩家坐在桌边,NESW之一。游戏存储在数据库中,如下所示:

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" />
  ...

但是,这种方法似乎很尴尬,我想找到更好的解决方案。那么,如何将多个表列映射到单个映射中?一些正在发挥作用的条件:

  1. 受影响的列数固定 - 准确且始终为 4
  2. 每列不为空
  3. 物业 | 列类型都一样- String|varchar(127)
  4. 要使用的密钥是已知的、固定的并且都是相同类型的
  5. 我宁愿使用xml映射,但注释也可以。

标签: javahibernate

解决方案


推荐阅读