Прежде всего, простите меня за мой плохой уровень английского языка.Я постараюсь быть максимально понятным.
Я пытаюсь изменить порядок воспроизведения музыкальных файлов.Плейлист - это в основном 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
, но я бы предпочел этого не делать.