JPA使用列表的一对多关系-OrderBy被忽略/不起作用
我将尝试将问题表述得更简单:JPA使用列表的一对多关系-OrderBy被忽略/不起作用,jpa,eclipselink,Jpa,Eclipselink,我将尝试将问题表述得更简单: @Entity public class One implements Serializable { ... @Id @GeneratedValue private Long id; @OneToMany @OrderBy("name ASC") private List<Many> many; ... 服务类(EJB) 主课 public class Main { public static void main(String[] args)
@Entity
public class One implements Serializable {
...
@Id
@GeneratedValue
private Long id;
@OneToMany
@OrderBy("name ASC")
private List<Many> many;
...
服务类(EJB)
主课
public class Main {
public static void main(String[] args) throws NamingException {
EJBContainer container = EJBContainer.createEJBContainer();
Context ctx = container.getContext();
Service service = (Service) ctx.lookup("java:global/classes/Service");
One one = service.createOne();
Many many = service.createMany("the-first");
service.add(one.getId(), many.getId());
many = service.createMany("a-second");
one = service.add(one.getId(), many.getId());
one = service.find(one.getId());
System.out.println("-------------------------------------------------");
for (Many m : one.getMany()) {
System.out.println(m.getName());
}
container.close();
}
}
输出:
the-first
a-second
无论我向@OrderBy注释(name ASC、name DESC、id ASC、id DESC)写入什么内容,输出总是按id升序
你知道我遗漏了什么吗?Orderby注释实际上不是这样工作的。根据,注释“在检索集合时指定集合元素的顺序…”
因此,注释会影响查询(find)的结果,但不会指定将结果集存储到的集合中的顺序 Orderby注释实际上不是这样工作的。根据,注释“在检索集合时指定集合元素的顺序…”
因此,注释会影响查询(find)的结果,但不会指定将结果集存储到的集合中的顺序 解决方案是调用em.refresh(在正确的位置),如Chris和WPrecht所述。我必须在一个单独的EJB方法中完成这项工作 这不起作用:
public One find(Long id) {
em.refresh(em.find(One.class, id)); // did not work
One one = em.find(One.class, id);
return one;
}
添加单独的刷新方法
public void refresh(Long id) {
em.refresh(em.find(One.class, id));
}
并在主程序中调用它
...
service.refresh(one.getId());
one = service.find(one.getId());
...
工作
可能我需要多读一些书来理解缓存 解决方案是调用em.refresh(在正确的位置),如Chris和WPrecht所述。我必须在一个单独的EJB方法中完成这项工作 这不起作用:
public One find(Long id) {
em.refresh(em.find(One.class, id)); // did not work
One one = em.find(One.class, id);
return one;
}
添加单独的刷新方法
public void refresh(Long id) {
em.refresh(em.find(One.class, id));
}
并在主程序中调用它
...
service.refresh(one.getId());
one = service.find(one.getId());
...
工作
可能我需要多读一些书来理解缓存 谢谢你的评论。但是我不这样理解javadoc。您能否提供一个示例,如何检索集合元素?据我所知,@OrderBy注释并不强制数据库中实体的任何顺序。但在检索时,它们会按指定的顺序插入到集合(列表)中。看最后的主课。one=service.find(one.getId());(基本上是em.find(One.class,id);)所以我确实检索了实体。但它并不维护实体中的顺序,因此在添加新元素时,由应用程序来维护这种顺序。由于实体缓存的原因,每个查询或查找调用不一定都会进入数据库,因此必须始终维护此列表,否则可能会出现类似问题。您可以通过调用em.refresh强制重新加载列表,但只维护收藏顺序更有效。再次感谢。我想我理解你的评论和文件。但该注释不适用于我的示例代码。请再看一遍。我将两个
Many
实体插入实体的多个关系One
。然后我保存一个并再次检索它。现在,应该对多个关系列表进行排序。但事实并非如此。调用刷新没有效果。我不知道这里出了什么问题,也不知道如何缩小这个问题。谢谢你的评论。但是我不这样理解javadoc。您能否提供一个示例,如何检索集合元素?据我所知,@OrderBy注释并不强制数据库中实体的任何顺序。但在检索时,它们会按指定的顺序插入到集合(列表)中。看最后的主课。one=service.find(one.getId());(基本上是em.find(One.class,id);)所以我确实检索了实体。但它并不维护实体中的顺序,因此在添加新元素时,由应用程序来维护这种顺序。由于实体缓存的原因,每个查询或查找调用不一定都会进入数据库,因此必须始终维护此列表,否则可能会出现类似问题。您可以通过调用em.refresh强制重新加载列表,但只维护收藏顺序更有效。再次感谢。我想我理解你的评论和文件。但该注释不适用于我的示例代码。请再看一遍。我将两个Many
实体插入实体的多个关系One
。然后我保存一个并再次检索它。现在,应该对多个关系列表进行排序。但事实并非如此。调用刷新没有效果。我不知道这里出了什么问题,也不知道如何缩小问题的范围。我正在使用EclipseLink 2.6.0。em.refresh(entity)也为我做了这项工作(em.find(class,id)不足以应用订单)-感谢您的提示。我正在使用EclipseLink 2.6.0。em.refresh(entity)也为我做了这项工作(em.find(class,id)不足以应用订单)-感谢您的提示。