我有一个Reward类型的对象,它是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属性。
到目前为止,我提出的唯一解决方案是在数据库中没有外键到Reward,而是将所有Reward字段的非规范化放在Cards表中。
因此,例如,Cards表将包含reward_type,amount和weapon_data列,而不是奖励的外键。
我向朋友们询问了这种方法,他们提到它是非规范化的,所以它不是一个优雅的解决方案。
我也会使用名为Sql2o的瘦JDBC包装器来解决这个问题,因为它无法帮助我以平滑的方式将对象映射到数据库表。
我已经考虑将我的数据库表的 某些 切换到NoSql数据库,这会使这种情况变得更加容易,因为这些对象很容易映射到JSON文档并存储在数据库中。
但是,它确实会引起一些大问题,因为我的数据库中的其他表包含对Cards表的外键引用。
如果有人有解决方案将这些奖励对象以干净的方式映射到数据库,那么非常感谢所有帮助。
感谢您阅读本文。
答案 0 :(得分:0)
我使用Hibernate ORM解决了这个问题。将字段标记为@Embedded,其类型为@Embeddable解决了问题。
似乎解决方案是简单地将不包含标识符的字段放在包含的表中,或者嵌入它们。
对于集合,这是更复杂的,需要生成伪id才能持久化实体,但这是另一个主题。