我刚刚开始使用 Play 框架,在我的模型类之一中使用集合时遇到了一些问题。我对 Play 和 JPA/Hibernate 非常陌生,所以请原谅我的菜鸟...我尝试在网络上搜索答案,但找不到我想要的东西。
本质上,我有 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();
如果我省略刷新调用,则稍后从数据库获取其内容时,列表似乎不会被保存。然而,flush 调用会导致以下异常:
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)
我意识到我可能在这里做了一些愚蠢的事情(持久化之后的flush()真的有必要吗?)并且不明白这些东西如何正常工作,但是,我一直在努力寻找有关这个确切问题的信息。任何有关我如何实现上述目标的帮助将不胜感激。
Thanks!