Java 我的LinkedList未按原样保存(关于其元素顺序)
首先,请原谅我的英语水平很差。我会尽量让人理解 我正在尝试重新订购音乐文件的播放列表。播放列表基本上是一个带有名称的链接列表。Java 我的LinkedList未按原样保存(关于其元素顺序),java,jpa,Java,Jpa,首先,请原谅我的英语水平很差。我会尽量让人理解 我正在尝试重新订购音乐文件的播放列表。播放列表基本上是一个带有名称的链接列表。 我改变了一个元素的位置,它看起来应该是,酷。但是当我把它保存在数据库中时,顺序不会改变!我做错了什么,这是事实,但经过数小时的调试,我的大脑真的可以自己使用调试器 以下是我的jsf代码(在p:datatable中): 支持bean代码: @Named(value=“playlimbean”) @会议范围 公共类playlimbean实现了可序列化{ @EJB 私人
我改变了一个元素的位置,它看起来应该是,酷。但是当我把它保存在数据库中时,顺序不会改变!我做错了什么,这是事实,但经过数小时的调试,我的大脑真的可以自己使用调试器 以下是我的jsf代码(在p:datatable中):
支持bean代码:
@Named(value=“playlimbean”)
@会议范围
公共类playlimbean实现了可序列化{
@EJB
私人播放管理器播放管理器;
私人播放列表;
//...
public void increasePosition(字符串musicURL){
当前播放列表。增加位置(musicURL);
playlimager.save(当前播放列表);
}
//...
}
“currentPlaylist”显然是一个播放列表,下面是实体bean“Playlist”中方法的代码:
@实体
@NamedQuery(/*…*/)
公共类播放列表实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
@OneToMany(cascade={CascadeType.REFRESH,CascadeType.MERGE},fetch=FetchType.EAGER)
@订货人(/**/
私人联络员;
私有字符串名称;
//...
公共无效增量位置(字符串url){
如果(url!=null){
MusicFile mf=getMusicFileByURL(url);
int position=getPosition(url);
如果(位置
最后是播放列表管理器的代码,该管理器应将重新排序的播放列表保存在数据库中:
@无状态
@本地豆
公共类播放管理器{
@PersistenceContext(unitName=“Doozer ejbPU”)
私人实体管理者;
公共作废保存(播放列表播放列表){
Playlist p=em.find(Playlist.class,Playlist.getId());
如果(p!=null){
em.merge(播放列表);
}
否则{
em.persist(播放列表);
}
}
//...
}
最后一步中给出的播放列表是好的(重新排序)。所以我猜我的问题是实体管理器(我知道我是个天才…) 有人知道为什么吗 它可能来自级联类型吗?由于我对它缺乏了解,我不确定应该放哪一个。我尝试了
CascadeType。所有,但在添加音乐文件时它会引发异常。CascadeType.DETACH
是我的第一选择,因为我不想在删除播放列表时删除音乐…但我还是在这里ally不确定我是否知道我在说什么:(
[编辑]:多亏了Piotr Nowicki,我的问题发生了很大的变化:我如何定义@OrderBy
注释,以便根据链接列表的内部顺序对其进行排序?是否可能?简单/丑陋的方法是向音乐文件
实体添加一个属性位置
,但我宁愿不这样做。要保留列表中的元素在数据库中的存储顺序(并从数据库中进一步检索),应使用@OrderBy
或@OrderColumn
注释
在您的情况下,如果您只想在没有任何高级条件的情况下按顺序返回列表
,那么@OrderColumn
就足够了:
@OneToMany(...)
@OrderColumn
private LinkedList<MusicFile> musicList;
@OneToMany(…)
@订单列
私人联络员;
你的实体是如何注释的?你有任何@OrderColumn
或@OrderBy
注释吗?我刚刚编辑了我的帖子,所以它现在应该回答你的问题->实体没有任何关于其顺序的注释…但列表是“直接”的保存的应该是它的内部顺序,不是吗?多亏了你的帖子,Piotr,再经过一点挖掘,你似乎有了正确的直觉!!!没有任何@OrderBy
注释,元素是根据它们的id=>排序的,你知道如何定义列表属性的排序顺序吗?我不想添加属性pposition
到音乐实体,但是如果必须的话……您是否尝试在列表属性上添加@OrderColumn
?它应该会自动添加一个适当的列。我的英雄……。我让您回答:它解决了我的问题,挽救了我的一天!;)OrderColumn
需要JPA 2.0。它使用数据库上的一个额外字段来主订单信息,我认为您应该使用一个position额外字段,并在您重新排序列表时让持久性提供商相应地更新它。下面是一个关于主题的好总结:。要清楚:@OrderColumn(name=“position”)
,不需要其他任何东西。@AnthonyAccioly是的,这是JPA 2.0的功能;我猜您的其余评论(关于模型中的额外位置字段)是指JPA 1.0?而且您不需要指定@OrderColumn
name属性,因为JPA提供程序可以为您提供一个默认属性(以“propertyName\u ORDER”格式)我的意思是额外的列而不是字段lol:D。对于JPA2.0,它仍然需要数据库中的额外列,您可以让它应用@Piotr提到的默认值,但我想称它为position更有意义。它将根据您的需要使用该列来维护列表
内部顺序。再次感谢Piotr,并感谢Anthony的通知在我的例子中,action!@OrderColumn
应该足够了:它创建了一个名为“MUSICLIST_ORDER”的列。足够有意义了。