Card クラス内のフィールドである Reward タイプのオブジェクトがあります。Card クラスをデータベースに格納しようとしています。Card 内の他のフィールドは、データベースの永続性の問題ではないため、簡潔にするために、Card 内の Reward フィールドのみに関係します。
こちらがリワードクラスです。簡潔にするために、ゲッター/セッターは削除されました。
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 が含まれていないことです。これは、1 つのクラスにまとめられた Card プロパティのセットです。
私がこれまでに思いついた唯一の解決策は、データベース内の Reward への外部キーを持たず、代わりにすべての Reward フィールドを非正規化して Cards テーブル内に配置することです。
たとえば、Cards テーブルには、報酬への外部キーではなく、reward_type、amount、および weapon_data 列が含まれます。
この方法について友達に尋ねたところ、非正規化されているため、エレガントなソリューションではないと言われました。
また、Sql2o という名前のシン JDBC ラッパーを使用してこれをマッピングする際にも問題が発生します。オブジェクトをデータベース テーブルにスムーズにマッピングするのに役立つからです。
オブジェクトが JSON ドキュメントに簡単にマップされ、データベース内に格納されるため、データベース テーブルの一部を NoSql データベースに切り替えることを検討しました。これにより、この状況がはるかに簡単になります。
ただし、データベース内の他のテーブルには Cards テーブルへの外部キー参照が含まれているため、いくつかの大きな問題が発生します。
これらの Reward オブジェクトをクリーンな方法でデータベースにマップするソリューションを誰かが持っている場合は、すべての助けをいただければ幸いです。
これを読んでくれてありがとう。