我在映射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)
答案 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是每个字段的良好注释,你想停止持久化