হাইবারনেট org.hibernate নিক্ষেপ করে


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

বিটিডব্লিউ, প্রশ্নের সাথে সম্পর্কিত নয়, এটি একটি দীর্ঘ স্ট্যাকট্রেস। আপনার কাছে কিছু পুনরাবৃত্তি অনুরোধ রয়েছে। আপনি কি নিশ্চিত যে সেখানে সবকিছু ঠিক আছে?
বোজহো

স্ট্যাক-ট্রেসগুলি সর্বদা এত দীর্ঘ কেন তা নিশ্চিত নয়। আমি মনে করি যে প্রচুর পটভূমি পরিষেবা চলছে যা প্রভাবিত হয়েছে।
রামি 21

মনোযোগ দিন যদি আপনার আইডি স্থিতিশীল না হয় বা আপনার শ্রেণীর কোনও বৈশিষ্ট্য থাকে। আমার সাথে এটি ঘটেছে :)
জিন ফিলিপ

উত্তর:


433

আপনি টীকাযুক্ত ক্ষেত্রটি নিখোঁজ করছেন @Id। প্রত্যেকের @Entityএকটি দরকার @Id- এটি ডাটাবেসের প্রাথমিক কী।

যদি আপনি না চান যে আপনার সত্তা একটি পৃথক টেবিলটিতে স্থির থাকে, তবে বরং অন্য সত্তাগুলির অংশ হতে পারে তবে আপনি এর @Embeddableপরিবর্তে ব্যবহার করতে পারেন @Entity

হাইবারনেট সত্তা থেকে কিছু তথ্য ধরে রাখতে আপনি যদি কোনও ডেটা ট্রান্সফার অবজেক্টটি কেবল চান, তবে এতে কোনও টিকা ব্যবহার করুন না - এটিকে একটি সহজ পোজো রেখে দিন।

আপডেট: এসকিউএল ভিউ সম্পর্কিত, হাইবারনেট ডক্স লিখুন:

হাইবারনেট ম্যাপিংয়ের জন্য ভিউ এবং বেস টেবিলের মধ্যে কোনও পার্থক্য নেই। এটি ডাটাবেস পর্যায়ে স্বচ্ছ


2
আমার একটি @ আইডির ক্ষেত্র থাকতে হবে? আমার দৃষ্টিতে আইডি নেই, কঠোরভাবে বলছি।
রামি

"ভিউ" বলতে আপনার অর্থ কী? হাইবারনেটে কোনও "ভিউ" নেই। একমাত্র মডেল আছে।
বোঝো

1
ভাল, ভিউ কিছু আইডি বরাদ্দ করুন। এটি ছাড়া যেতে পারে না। প্রতিটি সারি (বস্তু) স্বতন্ত্ররূপে সনাক্ত করতে হবে।
বোঝো

@ আইড যোগ করার পরে একটি নতুন ব্যতিক্রম পেয়েছে
রামি

3
ধন্যবাদ! এটি একটি বিরক্তিকর নলপয়েন্টারফর্মহেল এক্সসেপশন স্থির করেছে!
ম্যালিক্স

172

আমার জন্য, javax.persistence.Idপরিবর্তে ব্যবহার করা উচিত org.springframework.data.annotation.Id। যে কেউ এই সমস্যার মুখোমুখি হয়েছেন, আপনি সঠিক Idশ্রেণিটি আমদানি করেছেন কিনা তা পরীক্ষা করতে পারেন ।


2
আপনি আমার দিনটি বাঁচিয়েছেন: ')
অমিত্রজিৎ বোস

একই সমস্যা ছিল।
অ্যাঞ্জেলথ্রেড

59

আপনি জাভ্যাক্স.পারস্পেসেন্সের চেয়ে @ আইডির জন্য একটি ভিন্ন লাইব্রেরি আমদানি করার সময় এই ত্রুটিটি ফেলে দেওয়া যেতে পারে ; আপনারও এই ক্ষেত্রে মনোযোগ দেওয়ার প্রয়োজন হতে পারে

আমার ক্ষেত্রে ছিল

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
মূল্যবান পরামর্শ .. org.springframework.data.annotation.Id plz
খ্রিস্টান মায়ার

13

নীচের কোডটি নালপয়েন্টার এক্সসেপশন সমাধান করতে পারে।

@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তবে উপরের ঘোষিত পদ্ধতির মতো আপনি আরও কিছু ঘোষণা করতে পারেন।


বেকোজ আপনার @ আইডির মান নির্ধারণ এবং আপডেট করা হয়নি যেখানে আপনি নাল পয়েন্টার ব্যতিক্রম পেয়েছেন ...
শিবেন্দ্র প্রকাশ শুক্ল

2

আমি জানি পাগল শোনায় কিন্তু আমি এই জাতীয় ত্রুটি পেয়েছি কারণ আমি অপসারণ করতে ভুলে গেছি

private static final long serialVersionUID = 1L;

সত্ত্বা রূপান্তরকরণের টেবিল যখন আমি করেছি তখন স্বয়ংক্রিয়ভাবে Eclipse JPA সরঞ্জাম দ্বারা উত্পাদিত হয়।

উপরের লাইনটি সরানো যা সমস্যার সমাধান করেছে


1

পিকে সত্তার জন্য @ এম্বেডযোগ্য আইড ব্যবহার করা আমার সমস্যার সমাধান করেছে।

@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না, হাইবারনেট ভাল নির্ধারণ করতে পারেন যদি একটি সত্তা অস্থায়ী ব্যবহার করে (এই ক্ষেত্রে সংশ্লিষ্ট টেবিলের সারিতে নেই) অথবা বিচ্ছিন্ন (এটা এই ক্ষেত্রে সংশ্লিষ্ট টেবিলের সারিতে রয়েছে, তবে এটি বর্তমান দৃ Pers়তা প্রসঙ্গে পরিচালিত হয়নি)।

বরাদ্দকৃত শনাক্তকারীকে অবশ্যই কলিংয়ের আগে অধ্যায়ের দ্বারা ম্যানুয়ালি সেট করতে হবে:

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

entityManager.persist(post);

স্বতঃ উত্পাদিত শনাক্তকারী

একটি স্বতঃ উত্পাদিত শনাক্তকারী এর জন্য @GeneratedValueএন্টোটেশন প্রয়োজন @Id:

@Id
@GeneratedValue
private int id;

যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , হাইবারনেট সত্তা সনাক্তকারীকে স্বতঃ-উত্পাদন করতে ব্যবহার করতে পারেন এমন 3 টি কৌশল রয়েছে:

  • IDENTITY
  • SEQUENCE
  • TABLE

IDENTITYকৌশল এড়ানো করা অন্তর্নিহিত ডাটাবেসের সিকোয়েন্স সমর্থন করে (যেমন, ওরাকল, পোস্টগ্রি 10.3 যেহেতু MariaDB , 2012 সাল থেকে SQL সার্ভার)। সিকোয়েন্সগুলি সমর্থন করে না এমন একমাত্র প্রধান ডাটাবেস হ'ল মাই এসকিউএল।

সমস্যাটি IDENTITYহ'ল স্বয়ংক্রিয় হাইবারনেট ব্যাচের সন্নিবেশগুলি এই কৌশলটির জন্য অক্ষম করা আছে। এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন

SEQUENCEকৌশল ভাল পছন্দ যদি না আপনি মাইএসকিউএল ব্যবহার করা হয়। জন্য SEQUENCEকৌশল, আপনার কাছে ব্যবহার করতে চান pooledঅপটিমাইজার যখন একই অধ্যবসায় কনটেক্সট একাধিক সত্ত্বা অমীমাংসিত সমস্যা ডাটাবেসের roundtrips সংখ্যা কমাতে।

TABLEজেনারেটরের একটি ভয়ানক পছন্দ কারণ এটা স্কেল নেই । বহনযোগ্যতার জন্য, আপনি SEQUENCEডিফল্টরূপে ব্যবহার করা ভাল এবং IDENTITYকেবল মাইএসকিউএল স্যুইচ করুন , যেমন এই নিবন্ধে ব্যাখ্যা করা হয়েছে ।


প্রথম উদাহরণটি থাকা উচিত নয় @GeneratedValue, তাই না?
জোসেফ কেচ

0

এই ত্রুটিটি ভুল আইডি ক্লাসটি আমদানির কারণে ঘটেছে। Org.springframework.data.annotation.javax.persistance.Id এ প্রয়োগ করার পরে পরিবর্তন করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.