首先,原谅我的英语水平很差。我会尽量让自己理解。
我正在尝试重新排序音乐文件的播放列表。播放列表基本上是带有名称的LinkedList<MusicFiles>
我改变了一个元素的位置,看起来应该是这样,很酷。但是当我将它保存在数据库中时,订单不会改变!我做错了什么,这是事实,但是经过几个小时的调试,我的脑子里真的可以使用调试器......
这是我的jsf代码(在p:datatable中):
<p:commandButton title="Move Down"
ajax="false"
image="down"
action="#{playlistMBean.increasePosition(musicFile.URL)}"
onclick="show_my_playlists?face-redirect=true"/>
支持bean代码:
@Named(value = "playlistMBean")
@SessionScoped
public class PlaylistMBean implements Serializable {
@EJB
private PlaylistManager playlistManager;
private Playlist currentPlaylist;
//...
public void increasePosition(String musicURL) {
currentPlaylist.increasePosition(musicURL);
playlistManager.save(currentPlaylist);
}
//...
}
&#34; currentPlaylist&#34;显然是一个播放列表,所以这里是实体bean中方法的代码&#34;播放列表&#34;:
@Entity
@NamedQueries(/*...*/)
public class Playlist implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToMany(cascade= {CascadeType.REFRESH, CascadeType.MERGE},fetch= FetchType.EAGER)
@OrderBy(/* ??????????? */
private LinkedList<MusicFile> musicList;
private String name;
//...
public void increasePosition(String url) {
if (url != null) {
MusicFile mf = getMusicFileByURL(url);
int position = getPosition(url);
if (position < musicList.size() - 1) {
musicList.remove(position);
musicList.add(position + 1, mf);
}
}
}
最后是播放列表管理器的代码,它应该将重新排序的播放列表保存在数据库中:
@Stateless
@LocalBean
public class PlaylistManager {
@PersistenceContext(unitName = "Doozer-ejbPU")
private EntityManager em;
public void save(Playlist playlist) {
Playlist p = em.find(Playlist.class, playlist.getId());
if (p != null) {
em.merge(playlist);
}
else {
em.persist(playlist);
}
}
//...
}
最后一步中给定的播放列表是好的(重新排序)。所以我的猜测是我的问题在于实体经理(我知道这样的天才,我知道......)。
有谁知道为什么?
它可能来自级联类型吗?由于我对此缺乏了解,我不确定应该放哪一个。我尝试了CascadeType.ALL
,但在添加音乐文件时会引发异常。 CascadeType.DETACH
是我的第一选择,因为我不想在删除播放列表时删除音乐...但在这里我真的不知道我是否知道我是什么谈论:(
[编辑]:感谢Piotr Nowicki,我的问题已经发生了很大变化:如何定义@OrderBy
注释以便根据LinkedList
内部顺序对其进行排序?它甚至可能吗?简单/丑陋的方法是将属性position
添加到MusicFile
实体,但我不愿意。
答案 0 :(得分:3)
如果要保留List
中的元素存储在数据库中(并从中进一步检索)的顺序,则应使用@OrderBy
或@OrderColumn
注释。
在您的情况下,如果您只是希望在没有任何高级条件的情况下按顺序返回List
,那么@OrderColumn
就足够了:
@OneToMany(...)
@OrderColumn
private LinkedList<MusicFile> musicList;