2017-08-21 61 views
0

我在映射jpa時遇到問題,如果任何人有更多使用jpa的經驗並且可以幫助我。org.hibernate.MappingException:無法確定類型爲:java.util.Comparator

我在互聯網上跑了一些搜索,但nothings適合我。

我希望我會得到一些修復!

謝謝!

這裏我的代碼:

Metodologia.java

@Entity 
@Table(name = "metodologias") 
public class Metodologia { 
@Id @GeneratedValue 
private int id; 

private String nombre; 

@ManyToMany 
@JoinTable(
     name = "METODOLOGIA_CONDICION", 
     joinColumns = {@JoinColumn(name = "METODOLOGIA_ID")}, 
     inverseJoinColumns = {@JoinColumn(name = "CONDICION_ID")} 
     ) 

private List<Condicion> condiciones; 

public Metodologia(String n) { 
    this.nombre = n; 
    this.condiciones = new ArrayList<Condicion>(); 
} 

public void addCondicion(Condicion con) { 
    this.condiciones.add(con); 
} 

public String getNombre() { 
    return this.nombre; 
} 

public ArrayList<ResultadoEmpresa> evaluarEmpresas(ArrayList<Empresa> empresas, ArrayList<Indicador> indicadores) throws Exception { 
    ArrayList<ResultadoEmpresa> resultados = new ArrayList<ResultadoEmpresa>(); 
    ArrayList<ResultadoEmpresa> res; 

    empresas.forEach(emp->resultados.add(new ResultadoEmpresa(emp.getNombre(), 0))); 

    for (Condicion con : condiciones) { 
     res = con.evaluar(empresas, indicadores); 
     for (ResultadoEmpresa resemp : res) 
      for (ResultadoEmpresa emp : resultados) 
       if (emp.getEmpresa().equals(resemp.getEmpresa())) 
        emp.sumar(resemp.getValor()); 
    } 

    return ordenarLista(resultados); 
} 

Comparator<ResultadoEmpresa> byValor = new Comparator<ResultadoEmpresa>() { 
    public int compare(ResultadoEmpresa left, ResultadoEmpresa right) { 
     if (left.getValor() > (right.getValor())) { 
      return -1; 
     } else { 
      return 1; 
     } 
    } 
}; 

private ArrayList<ResultadoEmpresa> ordenarLista(ArrayList<ResultadoEmpresa> emp) { 
    Collections.sort(emp, byValor); 

    return emp; 
} 
} 

這是在執行一個錯誤報告,

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Comparator, at table: metodologias, for columns: [org.hibernate.mapping.Column(byValor)] 
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336) 
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:310) 
at org.hibernate.mapping.Property.isValid(Property.java:241) 
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:496) 

回答

0

造成的:org.hibernate.MappingException:無法確定類型爲:java.util.Comparator,在表中:metodologias,用於列:[org.hibernate.mapping.Column(byValor)]

這意味着:JPA /休眠要解釋字段Comparator byValor爲持續性柱(製備在數據庫中存儲)

JPA有兩個,(理論上)獨家方法來設置註釋:現場,或者在吸氣劑。 我假設,字段的第一個註釋它將整個業務切換到「字段」。 然後JPA提供程序的所有字段都將數據解釋爲數據持久化到數據庫,比較器也是沒有意義的。

如何糾正: 標記字段爲'transient',不能保留。

@Transient 
Comparator<ResultadoEmpresa> byValor = new Comparator<ResultadoEmpresa>()  { 
... 
{ 

免責聲明: 在現實中沒有測試,只解釋基於JPA的理論。 也許您有下一個錯誤。

編輯:替代解決方案:從實體類中刪除這些功能。我可以接受使用Comparable的實體類,但不能太多'函子'(個人意見)。 設計良好的「實體類」與「POJO」概念相似,因此刪除此類功能看起來不錯。

比較器通常在sort()調用附近提供,例如按名稱排序,按年齡等排序......不在數據類中。

一般來說,@Transient是每個字段的好註釋,你想停止持續

相關問題