2010-12-07 12 views
111

¿Por qué recibo esta excepción?hibernación excepción: org.hibernate.AnnotationException: no se ha especificado identificador para entidad: com..domain.idea.MAE_MFEView

package com.domain.idea; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 

import org.hibernate.annotations.AccessType; 

/** 
* object model for the view [InvestmentReturn].[vMAE_MFE] 
*/ 
@Entity 
@Table(name="vMAE_MFE", schema="InvestmentReturn") 
@AccessType("field") 
public class MAE_MFEView 
{ 
    /** 
    * trade property is a SuggestdTradeRecommendation object 
    */ 
    @OneToOne(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST }) 
    @JoinColumn(name = "suggestedTradeRecommendationID") 
    private SuggestedTradeRecommendation trade; 

    /** 
    * Most Adeverse Excursion value 
    */ 
    private int MAE; 

    public int getMAE() 
    { 
     return MAE; 
    } 

    /** 
    * Most Favorable Excursion value 
    */ 
    private int MFE; 

    public int getMFE() 
    { 
     return MFE; 
    } 

    /** 
    * @return trade property 
    * see #trade 
    */ 
    public SuggestedTradeRecommendation getTrade() 
    { 
     return trade; 
    } 
} 

Actualización: He cambiado mi código para tener este aspecto:

package com.domain.idea; 

import javax.persistence.CascadeType; 
import javax.persistence.FetchType; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 

import org.hibernate.annotations.AccessType; 

/** 
* object model for the view [InvestmentReturn].[vMAE_MFE] 
*/ 
@Entity 
@Table(name="vMAE_MFE", schema="InvestmentReturn") 
@AccessType("field") 
public class MAE_MFEView 
{ 
    /** 
    * trade property is a SuggestdTradeRecommendation object 
    */ 
    @Id 
    @OneToOne(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST }) 
    @JoinColumn(name = "suggestedTradeRecommendationID") 
    private SuggestedTradeRecommendation trade; 

    /** 
    * Most Adeverse Excursion value 
    */ 
    private int MAE; 

    public int getMAE() 
    { 
     return MAE; 
    } 

    /** 
    * Most Favorable Excursion value 
    */ 
    private int MFE; 

    public int getMFE() 
    { 
     return MFE; 
    } 

    /** 
    * @return trade property 
    * see #trade 
    */ 
    public SuggestedTradeRecommendation getTrade() 
    { 
     return trade; 
    } 
} 

pero ahora me estoy haciendo esta excepción:

Caused by: org.hibernate.MappingException: Could not determine type for: com.domain.idea.SuggestedTradeRecommendation, at table: vMAE_MFE, for columns: [org.hibernate.mapping.Column(trade)] 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292) 
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:276) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:216) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1135) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) 
    ... 145 more 
+0

por cierto, no relacionado con la pregunta, eso es un stacktrace bastante largo. Tienes algunas invocaciones repetitivas. ¿Estás seguro de que todo es correcto allí? – Bozho

+0

no estoy seguro de por qué los restos de pila son siempre tan largos. Creo que hay muchos servicios en segundo plano que se ven afectados. – Ramy

Respuesta

242

Usted se echa en falta un campo anotado con @Id. Cada @Entity necesita un @Id; esta es la clave principal en la base de datos.

Si no desea que su entidad persista en una tabla separada, sino que sea parte de otras entidades, puede usar @Embeddable en lugar de @Entity.

Si desea simplemente un objeto de transferencia de datos para contener algunos datos de la entidad de hibernación, no utilice anotaciones en absoluto, déjelo como un simple pojo.

Actualización: En lo que respecta a las vistas SQL, documentos Hibernate escribir:

No hay diferencia entre una vista y una tabla base para un mapeo de Hibernate. Esto es transparente en el nivel de base de datos

+1

Tengo que tener un campo @Id? Mi punto de vista no tiene, estrictamente hablando, una identificación. – Ramy

+0

¿Qué quiere decir "vista"? No hay "vista" en Hibernate. Solo hay modelo. – Bozho

+0

este es un modelo de vista sql. – Ramy

9

El siguiente código puede resolver la NullPointerException.

@Id 
@GeneratedValue 
@Column(name = "STOCK_ID", unique = true, nullable = false) 
public Integer getStockId() { 
    return this.stockId; 
} 
public void setStockId(Integer stockId) { 
    this.stockId = stockId; 
} 

Si agrega @Id, entonces se puede declarar un método más como el anterior declarado.

+0

becoz ur @Id el valor no se asignó y actualizó en ningún lugar donde haya obtenido una excepción de puntero nulo ... –

24

Para mí, javax.persistence.Id se debe utilizar en lugar de org.springframework.data.annotation.Id. Para cualquiera que encuentre este problema, puede verificar si importó la clase correcta Id.

3

Este error se puede producir al importar una biblioteca diferente para @Id que Javax.persistance.Id; Es posible que tenga que prestar atención este caso también

En mi caso tuve

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Table; 

import org.springframework.data.annotation.Id; 

@Entity 
public class Status { 

    @Id 
    @GeneratedValue 
    private int id; 

cuando cambio el código como este, ¡Gracias trabajó

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Table; 

import javax.persistence.Id; 

@Entity 
public class Status { 

    @Id 
    @GeneratedValue 
    private int id; 
Cuestiones relacionadas