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

Foi útil?

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 @Transientaqui. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top