web-dev-qa-db-fra.com

Exception hibernate: org.hibernate.AnnotationException: aucun identifiant spécifié pour l'entité: com..domain.idea.MAE_MFEView

Pourquoi ai-je cette exception?

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;
    }
}

Mise à jour: j'ai changé mon code pour ressembler à ceci:

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;
    }
}

mais maintenant je reçois cette exception:

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
174
Ramy

Il vous manque un champ annoté avec @Id. Chaque @Entity nécessite un @Id - il s'agit de la clé primaire de la base de données.

Si vous ne voulez pas que votre entité soit conservée dans une table distincte, mais fasse plutôt partie d'autres entités, vous pouvez utiliser @Embeddable au lieu de @Entity.

Si vous voulez simplement qu'un objet de transfert de données contienne des données de l'entité d'hibernation, n'utilisez aucune annotation dessus - laissez-le comme un simple pojo.

Mise à jour: en ce qui concerne les vues SQL, la documentation d'Hibernate écrit:

Il n'y a pas de différence entre une vue et une table de base pour un mappage Hibernate. Ceci est transparent au niveau de la base de données

380
Bozho

Pour moi, javax.persistence.Id devrait être utilisé à la place de org.springframework.data.annotation.Id. Pour tous ceux qui ont rencontré ce problème, vous pouvez vérifier si vous avez importé la bonne classe Id.

117
Searene

Cette erreur peut être générée lorsque vous importez une bibliothèque différente de @Id que Javax.persistance.Id; Vous devrez peut-être faire attention à ce cas aussi

Dans mon cas j'avais

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;

quand je change le code comme ça, ça a marché

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;
49
tadtab

Le code ci-dessous peut résoudre l'exception 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 vous ajoutez @Id, vous pouvez en déclarer d'autres comme la méthode déclarée ci-dessus.

Je sais que ça a l'air fou, mais j'ai reçu une telle erreur parce que j'oublie d'enlever

private static final long serialVersionUID = 1L;

généré automatiquement par l'outil JPA Eclipse lors de la transformation d'un tableau en entités que j'ai effectuée.

Supprimer la ligne ci-dessus qui a résolu le problème

2
ittradco