【问题标题】:org.hibernate.MappingException: Could not determine type for: java.util.Comparatororg.hibernate.MappingException:无法确定类型:java.util.Comparator
【发布时间】:2017-08-21 23:46:28
【问题描述】:

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

我在互联网上进行了一些搜索,但没有什么对我有用。

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

谢谢!

这是我的代码:

Metologia.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)

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    原因:org.hibernate.MappingException:无法确定类型:java.util.Comparator,表:metodologias,列:[org.hibernate.mapping.Column(byValor)]

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

    JPA 有两种(理论上)专有的方法来设置注释:在字段上或在 getter 上。 我假设,field 的第一个注释它将整个业务切换到“field”。 然后 JPA 提供者将所有字段解释为可持久保存到 DB 的数据,Comparator 也是,这没有任何意义。

    如何纠正: 将字段标记为“瞬态”,不持久化。

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

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

    编辑:替代解决方案:从实体类中删除此类功能。我可以接受实现 Comparable 的实体类,但不能接受太多的“函子”(个人意见)。 良好设计的“实体类”类似于“POJO”概念,因此删除此类功能看起来没问题。

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

    一般来说,@Transient 对每个字段都是很好的注解,你想停止持久化

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2013-01-25
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多