1

我有一个 Reward 类型的对象,它是 Card 类中的一个字段。我正在尝试将 Card 类存储在数据库中。Card 中的其他字段对于数据库持久性来说不是问题,因此为简洁起见,我们只关注 Card 中的 Reward 字段。

这是奖励课程。为简洁起见,getter/setter 已被删除。

public class Reward {
private RewardType rewardType;
//Value should be 1 for weapons
private int amount;
//Null unless RewardType is weapon
private WeaponData weaponData;

public Reward() {
}

public Reward(RewardType rewardType, int amount) {
    if (rewardType == RewardType.WEAPON) {
        throw new IllegalArgumentException("A weapon must contain a non-null WeaponData field");
    }
    this.rewardType = rewardType;
    this.amount = amount;
}

public static class WeaponData {
    private int attack;
    private int durability;

    public WeaponData(int attack, int durability) {
        this.attack = attack;
        this.durability = durability;
    }

    public int getAttack() {
        return attack;
    }

    public void setAttack(int attack) {
        this.attack = attack;
    }

    public int getDurability() {
        return durability;
    }

    public void setDurability(int durability) {
        this.durability = durability;
    }
}

}

我在尝试将驻留在 Card 类中的这个对象映射到数据库时遇到的问题是 Reward 自然不是唯一实体,因此它不包含 id。它只是一组捆绑到单个类中的 Card 属性。

到目前为止,我提出的唯一解决方案是在数据库中没有奖励的外键,而是将所有奖励字段非规范化以放置在 Cards 表中。

例如,Cards 表将包含reward_type、amount 和 Weapon_data 列,而不是奖励的外键。

我向我的朋友询问了这个方法,他们提到它是非规范化的,所以这不是一个优雅的解决方案。

使用名为 Sql2o 的瘦 JDBC 包装器进行映射时也会遇到问题,因为它无法帮助我以平滑的方式将对象映射到数据库表。

我已经考虑将我的一些数据库表切换到 NoSql 数据库,这会使这种情况变得更容易,因为对象可以很容易地映射到 JSON 文档并存储在数据库中。

但是,它确实会带来一些大问题,因为我的数据库中的其他表包含对 Cards 表的外键引用。

如果有人有解决方案以干净的方式将这些 Reward 对象映射到数据库,我们将不胜感激。

谢谢您阅读此篇。

4

1 回答 1

0

我使用 Hibernate ORM 解决了这个问题。将字段标记为@Embedded 并将其类型标记为@Embeddable 解决了这个问题。

似乎解决方案是简单地将不包含标识符的字段放在包含表中,或嵌入它们。

对于集合,这更复杂,需要生成伪 ID 才能持久化实体,但这是另一个主题。

于 2017-03-08T17:28:47.573 回答