2016-09-11 7 views
1

私は、カードクラス内のフィールドであるReward型のオブジェクトを持っています。私は、データベース内に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; 
    } 
} 

}

私はデータベースにカードのクラス内にあるこのオブジェクトをマップしようとしたときに全体で来ています問題は、このようにそれが含まれていない、報酬が自然にユニークな実体ではないということですid。これは単なるクラスに束ねられたカードプロパティのセットです。

私が今までに思いついた唯一の解決策は、データベースの報酬に外部キーを持たず、代わりにカードテーブル内に配置される報酬のすべてのフィールドを非正規化することです。

たとえば、Cardsテーブルには、報酬の外部キーではなく、reward_type、amount、およびweapon_dataの各列が含まれます。

私はこの方法について友人に尋ねました。彼らはそれが非正規化されていると言いました。そのため、エレガントな解決策ではありません。

スムーズにオブジェクトをデータベーステーブルにマップすることができないため、Sql2oという名前のシンJDBCラッパーを使用してこれをマッピングする際の問題もあります。

私は、オブジェクトを簡単にJSON文書にマッピングされ、データベース内に格納されるので、この状況ははるかに容易になるだろうなNoSQLデータベースに私のデータベーステーブルの一部の切り替えを検討しています。

しかし、私のデータベース内の他のテーブルには、Cardsテーブルへの外部キーの参照が含まれているため、大きな問題があります。

これらの報酬オブジェクトをクリーンな方法でデータベースにマッピングする解決策があれば、すべての助力をいただければ幸いです。

ありがとうございます。

答えて

0

私はHibernate ORMを使用してこれを解決しました。フィールドを@Embeddedとしてマークし、そのタイプを@Embeddableとしてマークすると問題が解決しました。

解決策は、含まれているテーブル内に識別子が含まれていないフィールドを配置するか、またはを埋め込みにすることでした。

コレクションの場合、これはより複雑であり、エンティティを永続させるために擬似IDを生成する必要がありますが、この別のトピックです。

関連する問題