Hibernate MappingException
-
25-09-2019 - |
Pergunta
Estou recebendo este erro de hibernação:
org.hibernate.MappingException: Could not determine type for:
a.b.c.Results$BusinessDate, for columns: [org.hibernate.mapping.Column(businessDate)]
A aula está abaixo. Alguém sabe por que estou recebendo esse erro ??
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"businessDate"
})
@XmlRootElement(name = "Results")
@Entity(name = "Results")
@Table(name = "RESULT")
@Inheritance(strategy = InheritanceType.JOINED)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Results implements Equals, HashCode
{
@XmlElement(name = "BusinessDate", required = true)
protected Results.BusinessDate businessDate;
public Results.BusinessDate getBusinessDate() {
return businessDate;
}
public void setBusinessDate(Results.BusinessDate value) {
this.businessDate = value;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"raw",
"display"
})
@Entity(name = "Results$BusinessDate")
@Table(name = "BUSINESSDATE")
@Inheritance(strategy = InheritanceType.JOINED)
public static class BusinessDate implements Equals, HashCode
{
....
Atualizar: Este código foi gerado por Hyperjaxb. Então, não afirmo entender tudo, apenas tentando fazer algumas alterações!
Atualização2: Aqui está o cheio (sim, é grande) arquivo src
Solução
Usando uma classe aninhada estática como tipo de campo está bem e suportado. Mas o Hibernate não saberá como mapear um tipo tão complexo para um tipo de coluna (que é o que a mensagem de erro diz). Portanto, você precisará criar um tipo de usuário para lidar com isso ou para anotar o Results.BusinessDate
campo com um @OneToOne
anotação para persistir em outra mesa (eu também removeria o @Inheritance
o que é inútil, mas esse não é o problema aqui).
Atualizar: Apenas para esclarecer, usando um tipo de usuário ou mapeando o tipo complexo com @OneToOne
funciona. O código a seguir funciona perfeitamente (testado):
@Entity
public class EntityWithStaticNestedClass implements Serializable {
@Id
@GeneratedValue
private Long id;
@OneToOne
private EntityWithStaticNestedClass.StaticNestedClass nested;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public EntityWithStaticNestedClass.StaticNestedClass getNested() {
return nested;
}
public void setNested(EntityWithStaticNestedClass.StaticNestedClass nested) {
this.nested = nested;
}
@Entity
public static class StaticNestedClass implements Serializable {
@Id
@GeneratedValue
private Long id;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
}
}
E ambas as entidades ficam bem persistidas em suas respectivas tabelas. Mas você não está mostrando o código inteiro nem o erro exato, então não posso dizer por que não foi para você (talvez você esteja perdendo @Id
etc).
Dito isto, se você não quiser businessDate
para ser persistido, anote -o com @Transient
(Com JPA, os campos são persistentes por padrão):
Atualizar: Você não pode misturar acesso de campo e propriedade. Então você precisa anotar getBusinessDate()
com @Transient
aqui. Desculpe, eu não conseguia adivinhar isso do código mostrado e pensei que seria óbvio.
Outras dicas
Mesmo comentário que Kevin Crowell. Você também pode não usar classes internas para tipos de entidades. Na verdade, nunca vi alguém fazer isso com o Hibernate, então não tenho certeza se é possível ou como você o mapeia.
A anotação @Ineritance na classe interna de negócios também parece um pouco suspeita - a classe interna é estática e não herda de outra entidade, a menos que o hibernato trate as classes internas como "herdadas".
No geral, não tenho muita certeza do que você está tentando realizar, mas pode estar dificultando sua vida do que deveria. Eu recomendaria não usar classes internas e apenas mapear todas as entidades de uma maneira mais simples/direta.