Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的LinkedList未按原样保存(关于其元素顺序)_Java_Jpa - Fatal编程技术网

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”的列。足够有意义了。