2010-12-07 3 views
111

Pourquoi ai-je cette exception?hibernate exception: org.hibernate.AnnotationException: Aucun identifiant spécifié pour l'entité: 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; 
    } 
} 

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 
+0

BTW, sans rapport avec la question, qui est un stacktrace plutôt long. Vous avez des invocations répétées. Êtes-vous sûr que tout est correct là-bas. – Bozho

+0

ne sait pas trop pourquoi les traces de pile sont toujours aussi longues. Je pense que beaucoup de services d'arrière-plan sont en cours d'exécution. – Ramy

Répondre

242

Il vous manque un champ annotée avec @Id. Chaque @Entity a besoin d'un @Id - c'est la clé primaire dans la base de données.

Si vous ne souhaitez 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é mise en veille prolongée, n'utilisez aucune annotation sur ce dernier - laissez-le simple.

Mise à jour: En ce qui concerne des vues SQL, docs Hibernate écrire:

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

+1

Je dois avoir un champ @Id? Mon point de vue n'a pas, à proprement parler, une pièce d'identité. – Ramy

+0

Que voulez-vous dire "voir". Il n'y a pas de "vue" dans Hibernate. Il n'y a que le modèle. – Bozho

+0

ceci est un modèle de vue de sql. – Ramy

9

Le code ci-dessous permet de résoudre l'erreur 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 déclarer une méthode plus comme comme ci-dessus déclaré.

+0

becoz ur @Id valeur n'a pas assigner & mettre à jour partout où vous avez l'exception pointeur null ... –

24

Pour moi, javax.persistence.Id doit être utilisé au lieu 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.

3

Cette erreur peut être levée lorsque vous importez une bibliothèque différente pour @Id que Javax.persistance.Id; Vous pourriez avoir besoin de prêter 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 celui-ci, il a obtenu travaillé

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; 
Questions connexes