हाइबरनेट करें org.hibernate.AnnotationException: कोई पहचानकर्ता इकाई के लिए निर्दिष्ट नहीं है: com..domain.idea.MAE_MFEView


207

मुझे यह अपवाद क्यों मिल रहा है?

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

अपडेट: मैंने इस तरह दिखने के लिए अपना कोड बदल दिया है:

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

लेकिन अब मुझे यह अपवाद मिल रहा है:

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

btw, इस सवाल से असंबंधित, यह एक लंबा स्टैकट्रेस है। आपके पास कुछ दोहराए गए चालान हैं। क्या आपको यकीन है कि सब कुछ सही है।
बोझाओ

यह भी सुनिश्चित नहीं है कि स्टैक-निशान हमेशा इतने लंबे क्यों होते हैं। मुझे लगता है कि बहुत सारी पृष्ठभूमि सेवाएं चल रही हैं जो प्रभावित हैं।
रामी

ध्यान दें कि क्या आपकी आईडी स्थिर नहीं है या आपकी कक्षा में कुछ विशेषताएँ हैं। यह मेरे साथ हुआ :)
Gean Felipe

जवाबों:


433

आप के साथ एनोटेट किए गए फ़ील्ड को याद कर रहे हैं @Id। प्रत्येक की @Entityजरूरत है @Id- यह डेटाबेस में प्राथमिक कुंजी है।

यदि आप नहीं चाहते हैं कि आपकी इकाई को एक अलग तालिका में रखा जाए, बल्कि अन्य संस्थाओं का हिस्सा बनें, तो आप @Embeddableइसके बजाय उपयोग कर सकते हैं @Entity

यदि आप हाइबरनेट इकाई से कुछ डेटा रखने के लिए बस एक डेटा ट्रांसफर ऑब्जेक्ट चाहते हैं, तो उस पर कोई भी एनोटेशन का उपयोग न करें - इसे एक साधारण पूजो छोड़ दें।

अद्यतन: SQL विचारों के संबंध में, हाइबरनेट डॉक्स लिखते हैं:

हाइबरनेट मानचित्रण के लिए दृश्य और आधार तालिका के बीच कोई अंतर नहीं है। यह डेटाबेस स्तर पर पारदर्शी है


2
मेरे पास @Id फ़ील्ड होना चाहिए? मेरे विचार में कड़ाई नहीं है, एक आईडी है।
रामी

आपका क्या मतलब है "दृश्य"। हाइबरनेट में कोई "दृश्य" नहीं है। केवल मॉडल है।
बूझो

1
ठीक है, देखने के लिए कुछ आईडी असाइन करें। इसके बिना नहीं जा सकते। प्रत्येक पंक्ति (ऑब्जेक्ट) को विशिष्ट रूप से पहचाना जाना चाहिए।
बोझाओ Bo

@Id
Ramy

3
धन्यवाद! यह एक कष्टप्रद NullPointerFromHellException तय किया!
malix

172

मेरे लिए, के javax.persistence.Idबजाय इस्तेमाल किया जाना चाहिए org.springframework.data.annotation.Id। इस समस्या का सामना करने वाले किसी भी व्यक्ति के लिए, आप जांच सकते हैं कि आपने सही Idवर्ग आयात किया है या नहीं।


2
आपने मेरा दिन बचाया: ')
अमितजीत बोस

एक समान मुद्दा था।
एंजेलथ्रेड

59

जब आप Javax.persistance.Id की तुलना में @Id के लिए एक अलग पुस्तकालय आयात करते हैं तो यह त्रुटि डाली जा सकती है ; आपको इस मामले पर भी ध्यान देने की आवश्यकता हो सकती है

मेरे मामले में मेरे पास था

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;

जब मैं इस तरह कोड को बदलता हूं, तो यह काम कर गया

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;

1
मूल्यवान सलाह .. deprecate org.springframework.data.annotation.Id plz
क्रिश्चियन मेयर

13

नीचे दिए गए कोड 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;
}

यदि आप जोड़ते हैं @Id, तो आप घोषित विधि के अनुसार कुछ और घोषित कर सकते हैं।


becoz ur @Id वैल्यू असाइन नहीं किया गया और कहीं भी अपडेट नहीं किया गया, जिसमें आपको यूएल पॉइंटर अपवाद मिला ...
शिवेंद्र प्रकाश शुक्ल

2

मुझे पता है कि मैं पागल लग रहा हूं लेकिन मुझे ऐसी त्रुटि मिली क्योंकि मैं हटाना भूल गया

private static final long serialVersionUID = 1L;

स्वचालित रूप से ग्रहण JPA उपकरण द्वारा उत्पन्न जब मैं परिवर्तन के लिए एक तालिका संस्थाओं में किया है।

ऊपर की लाइन को हटाने से समस्या हल हो गई


1

पीके इकाई के लिए @EmbeddableId का उपयोग करने से मेरी समस्या हल हो गई है।

@Entity
@Table(name="SAMPLE")
 public class SampleEntity implements Serializable{
   private static final long serialVersionUID = 1L;

   @EmbeddedId
   SampleEntityPK id;

 }

1

मुझे लगता है कि मॉडल वर्ग के गलत आयात के बाद यह मुद्दा है।

    import org.springframework.data.annotation.Id;

आम तौर पर, यह होना चाहिए:

    import javax.persistence.Id;

1

टी एल; डॉ

आप @Idइकाई गुण को याद कर रहे हैं, और यही कारण है कि हाइबरनेट उस अपवाद को फेंक रहा है।

इकाई पहचानकर्ता

किसी भी जेपीए इकाई के पास एक पहचानकर्ता संपत्ति होनी चाहिए, जो कि Idएनोटेशन के साथ चिह्नित है ।

दो प्रकार के पहचानकर्ता हैं:

  • सौंपा
  • स्व - उत्पन्न

निरुपित पहचानकर्ता

एक निर्धारित पहचानकर्ता निम्नानुसार दिखता है:

@Id
private Long id;

सूचना है कि हम एक आवरण (जैसे, उपयोग कर रहे हैं Long, Integer) के बजाय एक आदिम प्रकार (जैसे, long, int)। हाइबरनेट का उपयोग करते समय एक आवरण प्रकार का उपयोग करना एक बेहतर विकल्प है क्योंकि, यह idहै कि क्या है nullया नहीं, यह जांचने से कि हाइबरनेट बेहतर तरीके से यह निर्धारित कर सकता है कि क्या कोई इकाई क्षणिक है (इसमें संबंधित तालिका पंक्ति नहीं है) या अलग (इसमें एक संबद्ध पंक्ति है) लेकिन यह वर्तमान दृढ़ता संदर्भ द्वारा प्रबंधित नहीं है)।

असाइन किए गए कॉल करने से पहले निर्धारित पहचानकर्ता को एप्लिकेशन द्वारा मैन्युअल रूप से सेट किया जाना चाहिए:

Post post = new Post();
post.setId(1L);

entityManager.persist(post);

स्वतः उत्पन्न पहचानकर्ता

ऑटो-जेनरेट किए गए पहचानकर्ता को @GeneratedValueइसके अलावा एनोटेशन की आवश्यकता होती है @Id:

@Id
@GeneratedValue
private int id;

जैसा कि मैंने इस लेख में समझाया , 3 रणनीतियाँ हैं हाइबरनेट इकाई पहचानकर्ता को स्वतः उत्पन्न करने के लिए उपयोग कर सकती है:

  • IDENTITY
  • SEQUENCE
  • TABLE

IDENTITYरणनीति से परहेज किया जाना करने के लिए अंतर्निहित डेटाबेस दृश्यों का समर्थन करता है, तो है (उदाहरण के लिए, ओरेकल, PostgreSQL, 10.3 के बाद से MariaDB , 2012 के बाद से एसक्यूएल सर्वर)। अनुक्रमों का समर्थन नहीं करने वाला एकमात्र प्रमुख डेटाबेस MySQL है।

इसके साथ समस्या IDENTITYयह है कि इस रणनीति के लिए स्वचालित हाइबरनेट बैच आवेषण अक्षम हैं। इस विषय के बारे में अधिक जानकारी के लिए, इस लेख को देखें

SEQUENCEरणनीति सबसे अच्छा विकल्प है जब तक आप MySQL का उपयोग कर रहे है। के लिए SEQUENCEरणनीति, आप भी उपयोग करना चाहते हैं pooledअनुकूलक जब एक ही हठ संदर्भ में, विभिन्न इकाइयों बने डेटाबेस roundtrips की संख्या को कम करने के लिए।

TABLEजनरेटर एक भयानक विकल्प है क्योंकि यह पैमाने पर नहीं है । पोर्टेबिलिटी के लिए, आप SEQUENCEडिफ़ॉल्ट रूप से उपयोग कर रहे हैं और IDENTITYकेवल MySQL के लिए स्विच करें , जैसा कि इस लेख में बताया गया है ।


पहला उदाहरण नहीं होना चाहिए @GeneratedValue, है ना?
जोसेफ Cech

0

यह त्रुटि गलत आईडी वर्ग आयात करने के कारण हुई थी। Org.springframework.data.annotation.Id को javax.persistence.Id में बदलने के बाद आवेदन रन करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.