Hibernate lanza org.hibernate.AnnotationException: no se ha especificado ningún identificador para la entidad: com..domain.idea.MAE_MFEView

Resuelto Ramy asked hace 13 años • 15 respuestas

¿Por qué recibo esta excepción?

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: cambié mi código para que se vea así:

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 recibo 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
Ramy avatar Dec 08 '10 03:12 Ramy
Aceptado

Te falta un campo anotado con @Id. Cada uno @Entitynecesita una @Id: esta es la clave principal en la base de datos.

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

Si simplemente desea que un objeto de transferencia de datos contenga algunos datos de la entidad de hibernación, no utilice anotaciones de ningún tipo; déjelo en un simple pojo.

Actualización: con respecto a las vistas SQL, los documentos de Hibernate escriben:

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

Bozho avatar Dec 07 '2010 20:12 Bozho

Para mí, javax.persistence.Iddebería usarse en lugar de org.springframework.data.annotation.Id. Cualquiera que haya encontrado este problema puede verificar si importó la Idclase correcta.

Esto suele suceder si utiliza la función de sugerencia automática de IntelliJ (y quizás también de otros IDE) sin observar detenidamente cuál será la importación.

Searene avatar Sep 20 '2017 06:09 Searene

Este error puede aparecer cuando importa una biblioteca diferente para @Id que Javax.persistance.Id ; Es posible que también debas prestar atención a este caso.

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 de esta manera, funcionó

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;
Tadele Ayelegn avatar Dec 05 '2017 11:12 Tadele Ayelegn

El siguiente código puede resolver 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, puede declarar algo más como el método declarado anteriormente.

Shivendra Prakash Shukla avatar Oct 05 '2015 07:10 Shivendra Prakash Shukla