我刚刚开始使用 Play Framework,在我的一个模型类中使用集合时遇到了一些问题。我是 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 调用,则稍后从数据库中获取其内容时,列表似乎不会被保存。然而,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)
我意识到我可能在这里做了一些愚蠢的事情(persist 之后的 flush() 真的有必要吗?)并且不明白这些东西是如何正常工作的,但是,我一直在努力寻找关于这个确切问题的信息。如果能帮助我实现上述目标,我将不胜感激。
谢谢!
最佳答案
使用 Play Framework,您无需调用 persist
。尝试调用
currentSongs.save();
此外,Play Framework 会自动为您的歌曲模型创建一个 ID。因此,您可能不需要 songId
除非它是您想要保留的某个预定义值。
关于hibernate - Play Framework 和集合在模型类中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7002129/