Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
JPA使用列表的一对多关系-OrderBy被忽略/不起作用_Jpa_Eclipselink - Fatal编程技术网

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)不足以应用订单)-感谢您的提示。