Мой LinkedList не сохраняется должным образом (относительно порядка элементов) - PullRequest
3 голосов
/ 19 ноября 2011

Прежде всего, простите меня за мой плохой уровень английского языка.Я постараюсь быть максимально понятным.

Я пытаюсь изменить порядок воспроизведения музыкальных файлов.Плейлист - это в основном LinkedList<MusicFiles> с именем.Я меняю положение элемента, кажется, как и должно быть, круто.Но когда я сохраняю его в базе данных, порядок не меняется!Я делаю что-то не так, это факт, но после долгих часов отладки, мой разум мог действительно использовать отладчик для себя ...

Вот мой код jsf (внутри ap: datatable):

<p:commandButton title="Move Down" 
                 ajax="false" 
                 image="down" 
                 action="#{playlistMBean.increasePosition(musicFile.URL)}"  
                 onclick="show_my_playlists?face-redirect=true"/>

Код бобов основы:

@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);
    }

    //...
}

«currentPlaylist» - это, очевидно, Playlist, поэтому вот код метода в компоненте «Playlist»:

@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 был моим первым выбором, так как я не хочу удалять музыку при удалении плейлиста ... Но и здесь я действительно не знаю наверняка, знаю ли я, о чем говорю: (

[Редактировать]: Благодаря Петру Новицкому мой вопрос довольно сильно изменился: как я могу определить аннотацию @OrderBy, чтобы отсортировать LinkedList по внутреннему порядку? Возможно ли это?уродливым способом было бы добавить свойство position к сущности MusicFile, но я бы предпочел этого не делать.

1 Ответ

3 голосов
/ 19 ноября 2011

Если вы хотите сохранить порядок, в котором элементы в List хранятся в базе данных (и далее извлекаются из нее), вам следует использовать аннотации @OrderBy или @OrderColumn.

В вашем случае, если вы просто хотите, чтобы List был возвращен в порядке без каких-либо дополнительных условий, @OrderColumn должно быть достаточно:

@OneToMany(...)
@OrderColumn
private LinkedList<MusicFile> musicList;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...