org.hibernate.MappingException:无法确定:java.util.Comparator的类型

时间:2017-08-21 23:46:28

标签: java hibernate jpa

我在映射jpa时遇到问题,如果有人有更多使用jpa的经验,请帮助我。

我在互联网上搜索了一些搜索内容,但对我来说没有用。

我希望我能得到一些解决方法!!

谢谢!

这是我的代码:

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)

1 个答案:

答案 0 :(得分:0)

引起:org.hibernate.MappingException:无法确定类型:java.util.Comparator,在表:metodologias,对于列:[org.hibernate.mapping.Column(byValor)]

这意味着:JPA / Hibernate希望将字段Comparator byValor解释为持久列(准备存储在数据库中)

JPA有两个(理论上)排他性的方法来设置注释:on field或getter。 我假设,字段的第一个注释它将整个业务切换为“字段”。 那么JPA提供者所有字段都可以解释为DB,Comparator也可以保存的数据,这没有任何意义。

如何纠正: 将字段标记为“瞬态”,不会保留。

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

声明: 未经实际测试,仅基于JPA理论进行解释。 也许你有下一个错误。

编辑:替代解决方案:从实体类中删除此类函数。我可以接受实现Comparable的实体类,但不是太多'functor'(个人观点)。 设计良好的“实体类”类似于“POJO”概念,因此删除此类函数看起来不错。

比较器通常在sort()调用附近提供,例如按名称排序,按年龄等排序......不在数据类中。

通常,@ Transnsient是每个字段的良好注释,你想停止持久化