2011-08-09 5 views
3

방금 ​​Play Framework를 시작했고 모델 클래스 중 하나에서 컬렉션을 사용하여 몇 가지 문제가 발생했습니다. 나는 Play와 JPA/Hibernate에 매우 익숙하다. 그래서 나의 noobness를 변명해라. 나는 웹에서 답을 찾고자했지만 나는 찾고 있던 것을 찾을 수 없었다.Play Framework 및 모델 클래스의 컬렉션 사용

는 기본적으로, 나는이 개 모델을 가지고 :

@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

관련 문제