2011-08-09 4 views
3

私はPlay Frameworkを使い始めました。モデルクラスのコレクションでいくつかの問題が発生しています。私はPlayとJPA/Hibernateの新機能ですので、私のnoobnessを言い訳してください...私は答えをWeb上で検索しようとしましたが、私が探していたものを見つけることができませんでした。Play Frameworkとモデルクラスでのコレクションの使用

基本的に、私は2つのモデルがあります:私はここに欲しい

@Entity 
public class Song extends Model 
{ 
    @Column(unique = true) 
    public int songId; 
    public String name; 
    public String artist; 

    public Song() {} 

    public Song(int songId, String name, String artist) 
    { 
     this.songId = songId; 
     this.name = name; 
     this.artist = artist; 
    } 
} 

@Entity 
public class CurrentSongList extends Model { 

    @OneToMany(orphanRemoval=false) 
    public List<Song> currentSongList; 
} 

が一時的にこれらの曲のサブセットを保持するために、データベース内のすべての曲と、リストを持っていることです(リストの内容は、時間の経過とともに変化します)...リストが削除された場合、私は曲が削除されることを望んでいません(曲はリストへの参照を保持するべきではありません)。私がアプリケーション起動時にしようとするのは、データファイルから曲をロードし、曲のサブセットをリストに挿入し、下のコードでリストを保存することです。これは私が無限の問題を抱えていた場所です。

Fixtures.deleteDatabase(); 
Fixtures.loadModels("songlist.yaml"); 

List<Song> songs = Song.findAll(); 
CurrentSongList.deleteAll(); 
CurrentSongList currentSongs = new CurrentSongList(); 
currentSongs.currentSongList = new ArrayList<Song>(); 
currentSongs.currentSongList.add(songs.get(0)); 
currentSongs.currentSongList.add(songs.get(1)); 

EntityManager em = JPA.em(); 
em.persist(currentSongs); 
em.flush(); 

フラッシュ呼び出しを行わないと、後でDBから内容をフェッチするときにリストが保存されていないように見えます。 、私はおそらくここに愚かな何かをやって実現

Caused by: org.hibernate.HibernateException: Found two representations of same collection: models.CurrentSongList.currentSongList 
    at org.hibernate.engine.Collections.processReachableCollection(Collections.java:175) 
    at org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:60) 
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122) 
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83) 
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77) 
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:165) 
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:240) 
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76) 

とこのようなものが正常に動作するかを理解していない(インクルードが本当に必要な持続した後)(フラッシュですか?):フラッシュコールは、しかし、次の例外が発生しますしかし、私はこの正確な問題に関する情報を見つけるのに苦労しました。上記を達成するためにどのように手をつけるべきかについての助言は大変ありがたく思っています。

ありがとうございます!

+0

songlist.yamlの内容を投稿すると便利な場合があります – Ryan

答えて

2

Play Frameworkでは、persistに電話する必要はありません。試してみてください

currentSongs.save(); 

また、Play FrameworkはあなたのソングモデルのIDを自動的に作成します。したがって、あなたが保持したい予め定義された値でない限り、songIdは必要ありません。

+0

あなたのエラーに基づいて、リストの名前をあなたのクラスと同じでないように変更したい場合があります。 – Ryan

+0

素晴らしい...そのトリックでした!ありがとう。 – user192585

+0

ようこそ。私は助けることができてうれしいです。 – Ryan

関連する問題