2016-10-25 9 views
0

私はこれら2つのエンティティテーブルを1つのモデルクラス、ゲーム、プラットフォームにマップしようとしています。ゲームは複数のプラットフォームを持つことができます。テーブルは複数の列を持っているが、私はちょうどこれに関連しているものを示していますことをJPAマッピング2エンティティテーブルとそれらの間の関係テーブル

CREATE TABLE IF NOT EXISTS game_platforms (
id   serial not null primary key, 
game_id  INTEGER NOT NULL, 
platform_id INTEGER NOT NULL, 
release_date date not null, 

FOREIGN KEY (game_id) REFERENCES games (id) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY (platform_id) REFERENCES platforms (id) ON DELETE CASCADE ON UPDATE CASCADE, 
UNIQUE(game_id,platform_id, release_date) --The same game can be released for the same platform multiple times (i.e. remaster) 
); 

CREATE TABLE IF NOT EXISTS games (
id       SERIAL NOT NULL PRIMARY KEY, 
name      VARCHAR, 
summary      TEXT, 
avg_score     REAL, 
); 

CREATE TABLE IF NOT EXISTS platforms (
id SERIAL NOT NULL PRIMARY KEY, 
name VARCHAR 
); 

そして、関係テーブルと呼ばれるGame_Platforms:だから私のデシベルに私は、次の表を持っています問題。

だから私のモデルに私はJPA

私はそれが必要で見つからなかったため、クラスを持っていない
@Entity 
@Table(name = "games") 
public class Game { 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "games_gameid_seq") 
private long id; 

@Column(length = 100, nullable = false, unique = true) 
private String name; 

//Map with platforms 
private Map<String, LocalDate> platforms; 

そしてプラットフォームを使用してDBにマッピングする以下のクラスがあります。 @OneToManyアノテーションはこれをマップするのに十分ではないと私は考えています。 私のモデルにクラス "Platform"を追加することは、ほとんどの私のインターフェイスを変更する必要があるため、最後の手段になるでしょう、アプリ全体を変更する必要があります。どのようにこれをaproachする上の任意のアイデア?前もって感謝します!

+0

技術的には、GamePlatformエンティティを追加することができます(これは実際にモデルの一部であり、作成することはありません)。次に、Map オブジェクトを生成するメソッドを追加します。コードは動作し続けます。あなたはそれを非難することができ、時にはそれを1つのビッグバンではなくフェーズアウトすることができます。 – Gimby

+0

プラットフォームテーブルからID列を削除し、 '@ ElementCollection'を使用します。プラットフォームはエンティティとしてマッピングする必要はありません。マップを使用したソリューションについては、ここで詳しく説明します。 http://stackoverflow.com/questions/3393649/storing-a-mapstring-string-using-jpa –

+0

あなたの2つの素晴らしい答えに感謝します!私はそれらをチェックアウトする! –

答えて

1

は、オブジェクトリレーショナルモデルで考えるべきです - キーワード:オブジェクトしたがって、エンティティとしてテーブルをマップしたくない場合は、意図したとおりにテクノロジを使用できないため、ニーズに非常に逆効果があります。ネイティブクエリを使用する必要があります。

代わりに、関連するすべてのテーブル(この場合はGamPlatform)をマッピングし、実際にJPAに関係マッピングを追加することでJPAを動作させます。

@Entity 
public class Game { 

    ... 

    @OneToMany(mappedBy="game") 
    private Set<GamePlatform> gamePlatforms; 

    ... 
} 

解決すべき本当の問題は、この変更のために破損する既存のコードの大きな山があるという事実です。一時的にそれに対処するには、既存のgetterをプラットフォームのプロパティとしてそのまま維持し、水の下で、新しく定義されたモデルから返されたHashMapを構築することができます。ゲッターと仮定するとgetPlatforms()命名されています

@Deprecated 
public Map<String, LocalDate> getPlatforms(){ 
    Map<String,LocalDate> ret = new HashMap<>(); 

    gamePlatforms.stream().forEach(gamePlatform -> { 
    ret.put(gamePlatform.getPlatform().getName(), gamePlatform.getReleaseDate()); 
    }); 

    return ret; 
} 

あなたは非推奨として、そのメソッドをマークし、時間をかけて代わりに適切なエンティティ・クラスを使用するコードを移行することができます。

脚注:私はCollectors.toMapを用いて上記行うにしてもコンパクトなJavaの8方法があると確信している、それはexercise to the readerとして残されています。

+0

jdbcから休止状態に移行することによって、私のdbが私のモデルと矛盾していることに気付きました。あなたが言ったように、モデルにプラットフォームや他のエンティティを追加する必要があります。私はインターフェースのリファクタリングを避けたいと思っていましたが、私はそれをする以外に選択肢がないことに気付きました。時間とあなたの一時的なソリューションの提案に感謝します。 –

0

私はあなたの意味を正しく理解すれば、1つのゲームがあり、各ゲームには複数のプラットフォームがあります! あなたはonToMany関係が必要で、プラットフォームモデルを作成する必要があります。このようにHibernate/JPAのAPIとしてオブジェクトリレーショナルマッピングツールを使用している場合 この例を見 Game.java

@Entity 
@Table(name = "games") 
public class Game { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "games_gameid_seq") 
    private long id; 

    @Column(name = "name", nullable = false) 
    private String name; 

    @OneToMany(mappedBy="game_name") 
    @Column(name = "PlatFormId", nullable = false) 
    private Set<PlatForm> PlatFormId= new HashSet<PlatForm>(0); 

} 

PlatForm.java

@Entity 
@Table(name = "platForm") 
public class PlatForm { 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "games_gameid_seq") 
private long id; 

@Column(name = "name", nullable = false) 
private String name; 

    @Column(name = "game_name", nullable = false) 
    private Game game; 
+0

私に答えてくれてありがとう。しかし、私が言ったように、私のモデルにプラットフォームクラスを追加するのが最後の手段です。誰も最高の方法を知らないなら、私はこれに固執します。再度、感謝します! –

関連する問題