我的LinkedList没有保存,因为它应该是(关于它的元素顺序)

时间:2011-11-19 13:00:32

标签: java jpa

首先,原谅我的英语水平很差。我会尽量让自己理解。

我正在尝试重新排序音乐文件的播放列表。播放列表基本上是带有名称的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实体,但我不愿意。

1 个答案:

答案 0 :(得分:3)

如果要保留List中的元素存储在数据库中(并从中进一步检索)的顺序,则应使用@OrderBy@OrderColumn注释。

在您的情况下,如果您只是希望在没有任何高级条件的情况下按顺序返回List,那么@OrderColumn就足够了:

@OneToMany(...)
@OrderColumn
private LinkedList<MusicFile> musicList;