java - TreeMap 内的顺序错误

标签 java jpa glassfish-3

我尝试在 map 内以特定顺序存储“模块”数据。我使用 TreeMap 来实现这一点。 当我读取数据时,我得到的顺序完全错误。它以键值 9 开始并以 0 结束。??? JPA 是否做 s.t.否则然后将值“放入”TreeMap 中?

@OneToMany(
    mappedBy="prditem", 
    fetch=FetchType.LAZY, 
    cascade=CascadeType.ALL,
    orphanRemoval=true,
    targetEntity=PubModule.class
)
@JoinColumn(name="prditmID")
@MapKey(name="order")
private Map<Integer, PubModule> modules = new PubModulesMap();

public class PubModulesMap extends TreeMap<Integer,PubModule> {

    @Override
public PubModule put(Integer key, PubModule value) {
    PubModule old = (PubModule)this.get(key);
        if (old!=null) {
            old.setPrditem(value.getPrditem());
    ....
}

Iterator <PubModule> it = list.values().iterator();
while (it.hasNext()) {
    PubModule pm = it.next();
    System.out.println(pm.getOrder());
}

9 8 7 6 5 4 3 2 1 0

最佳答案

意外顺序的原因是,JPA 不理解 map 应该排序。

通用解决方案是为您的 map 创建一个 getter 方法:

public Map<Integer, PubModule> getModules() {
   if (modules == null) {
      modules = new PubModulesMap();
   } else if (!(modules instanceof TreeMap)) {
      modules = new TreeMap(modules); // Or new PubModulesMap(modules)
   }
   return modules;
}

如果您使用 hibernate,则应添加 @Sort(type = SortType.NATURAL) 注释。

关于java - TreeMap 内的顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456165/

相关文章:

java - Quartz 作业中的 Websphere JNDI 查找失败

java - 如何区分音频文件和视频文件?

java - Playframework:发生 JPA 错误(无法构建 EntityManagerFactory)

java - JPA Criteria 类似于 Hibernate Criteria Alias

java - Glassfish - 在节点之间共享 EJB Web 应用程序

jsf-2 - JSF2 忽略空 alt 属性

java - 无法使用 JNDI 访问远程 EJB 接口(interface)

java.io.IOException : Cannot run program "scala": CreateProcess error=2,

java - 使用 ejml(或其他 Java 库)的矩阵索引

java - Entity-Bean (JPA) 中的单向关系