হাইবারনেট "অবজেক্টটি কোনও সংরক্ষণ না করা ক্ষণস্থায়ী উদাহরণ উল্লেখ করে - ফ্লাশ করার আগে ক্ষণস্থায়ী উদাহরণটি সংরক্ষণ করুন" ত্রুটি


609

হাইবারনেট ব্যবহার করে অবজেক্টটি সংরক্ষণ করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি

object references an unsaved transient instance - save the transient instance before flushing

1
প্রসঙ্গে চান এই ত্রুটি? এটি ক্ষণস্থায়ী পরিবর্তনশীল সহ বা না ছাড়া?
বিজয়

উত্তর:


801

আপনার সংগ্রহ ম্যাপিংয়ের ক্ষেত্রে আপনার (যদি cascade="all"এক্সএমএল ব্যবহার করা হয়) বা cascade=CascadeType.ALL(টীকাগুলি ব্যবহার করা হয় ) অন্তর্ভুক্ত করা উচিত ।

এটি ঘটায় কারণ আপনার সত্তায় একটি সংগ্রহ রয়েছে এবং সেই সংগ্রহে এক বা একাধিক আইটেম রয়েছে যা ডাটাবেসে উপস্থিত নেই। উপরের বিকল্পগুলি নির্দিষ্ট করে আপনি তাদের পিতামাতার সংরক্ষণের সময় ডাটাবেসে সেভ করতে হাইবারনেটকে বলে tell


7
এটি কি অন্তর্নিহিত নয়? আপনি কি সবসময় হাইবারনেটকে সেভ করতে চান না?
মার্কাস লিওন

29
@ মার্কাস - না, তা নয়। আপনি এগুলি ম্যানুয়ালি পরিচালনা করতে চাইতে পারেন।
বোঝো

5
বোজো ঠিক আছে। আমি এমন পরিস্থিতিতে পড়েছি যেখানে আমি সংগ্রহ করেছি যা আমি তাদের আকারের কারণে বা ব্যবসায়ের নিয়মের কারণে ম্যানুয়ালি পরিচালনা করতে চেয়েছিলাম যা সংগ্রহের সমস্ত বস্তুকে একই সময়ে সংরক্ষণ করতে দেয় না।
অ্যালেক্স মার্শাল

26
এটি কেবল সংগ্রহের জন্যই ঘটে না তবে এক থেকে এক ম্যাপিংয়ের ক্ষেত্রেও সহজ হয়
সেবাস্তিয়ান লরবার

12
ক্যাসকেডটাইপ দিয়ে শুরু করা ভাল না P
সের্গেই শেভচাইক

248

আমি বিশ্বাস করি এটি কেবল পুনরাবৃত্ত উত্তর হতে পারে তবে কেবল স্পষ্ট করে বলতে গেলে আমি এটিকে একটি @OneToOneম্যাপিংয়ের পাশাপাশি পেয়েছি @OneToMany। উভয় ক্ষেত্রেই, এটি যে সত্যটি Childআমি যুক্ত করেছিলাম সেটি Parentডাটাবেসে সংরক্ষণ করা হয়নি। সুতরাং যখন আমি যোগ Childকরতে Parent, তারপর উদ্ধার Parent, হাইবারনেট শিরসঁচালন হবে "object references an unsaved transient instance - save the transient instance before flushing"বার্তা যখন মূল সংরক্ষণ।

মধ্যে যোগ করার পদ্ধতি cascade = {CascadeType.ALL}উপর Parent'sরেফারেন্স Childউভয় ক্ষেত্রেই সমস্যার সমাধান। এই সংরক্ষিত Childএবং Parent

যে কোনও পুনরাবৃত্ত উত্তরের জন্য দুঃখিত, কেবলমাত্র লোকেদের জন্য আরও স্পষ্ট করতে চেয়েছিলাম।

@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "performancelog_id")
public PerformanceLog getPerformanceLog() {
    return performanceLog;
}

7
যদি আমি @ ও টোটো ওন সম্পর্কের জন্য ক্যাসকেড সংরক্ষণ করতে চাই না তবে কী হবে? প্রথমবারের জন্য উভয় বস্তু তৈরি করার সময়, আমি কীভাবে ব্যাতিক্রমটি ট্রিগার না করে ডাটাবেসে সংরক্ষণ করতে পারি?
xtian

4
আমি যদি কিছু ক্ষেত্রে বাচ্চাকে কিছু ক্ষেত্রে বাঁচাতে চাই এবং অন্য কারও জন্য নয়?
ওমরুচান

@ এক্স্টিয়ান: ঠিক আছে তবে আপনাকে এন্টিম্যানেজারের সাথে অবজেক্টগুলি অব্যাহত রেখে ডাটাবেসে সংরক্ষণের সঠিক ক্রমের যত্ন নিতে হবে। বেসিক আপনি কেবল em.persist (অবজেক্ট 1) বলুন; em.persist (object2); ইত্যাদি
কাবা 713

আমি এই সমস্যাটি বিশেষভাবে পেয়েছি যখন আমি @Inheritance ব্যবহার করলাম, এই ক্ষেত্রে TABLE_PER_CLASS, আমি একটি সাবক্লাসটি উল্লেখ করছি। ক্যাসকেডটাইপ.এল সব ঠিক করে দিয়েছে।
জিম রিসপটার 21

অথবা আপনি নিজের সত্তা অবজেক্টটি new MyEntityডেটাবেস থেকে সিঙ্ক্রোনাইজড উদাহরণ না পাওয়ার পরিবর্তে (এটি ডেটাবেজে সিঙ্ক্রোনাইজ না করে - ফ্লাশিং) তৈরি করেছেন। সেই উদাহরণটি ব্যবহার করে হাইবারনেট অনুসন্ধান করা আপনাকে অবহিত করে যে আপনি ডাটাবেসে যা প্রত্যাশা করছেন তা আপনার অ্যাপ্লিকেশনের স্মৃতিতে আলাদা রয়েছে। এই ক্ষেত্রে - কেবলমাত্র ডিবি থেকে আপনার সত্তা ইনস্ট্যান্সেন্সটি সিঙ্ক্রোনাইজ করুন / এটি ব্যবহার করুন। কোনও ক্যাসকেডটাইপ.এল এর দরকার নেই।
জোন

66

হাইবারনেট যখন মনে করে যে কোনও বস্তু আপনি সংরক্ষণ করছেন তার সাথে সম্পর্কিত যে কোনও জিনিস সংরক্ষণ করা দরকার তা যখন সংরক্ষণ করে তখন এটি ঘটে।

আমার এই সমস্যাটি ছিল এবং রেফারেন্স করা অবজেক্টে পরিবর্তনগুলি সংরক্ষণ করতে চাইনি তাই আমি চাইছিলাম ক্যাসকেডের ধরণটি কোনও নয়।

কৌশলটি হ'ল রেফারেন্স করা অবজেক্টের আইডি এবং VERSION সেট করা আছে যাতে হাইবারনেট মনে করেন না যে রেফারেন্স করা অবজেক্টটি একটি নতুন অবজেক্ট যা সংরক্ষণের প্রয়োজন। এটি আমার পক্ষে কাজ করেছে।

আপনি যে শ্রেণীর সাথে সম্পর্কিত বস্তুগুলি (এবং সম্পর্কিত বস্তুর সাথে সম্পর্কিত বস্তুগুলি) কাজ করার জন্য সংরক্ষণ করছেন সে সমস্ত সম্পর্কের সন্ধান করুন এবং নিশ্চিত করুন যে আইডি এবং VERSION বস্তু গাছের সমস্ত বস্তুতে সেট করা আছে।


4
এই মন্তব্যটি আমাকে সঠিক পথে ফেলেছে। আমি পিতা-মাতার একটি নতুন উদাহরণ তার সন্তানের একটি সম্পত্তিতে অর্পণ করছিলাম। সুতরাং এনএইচ ভেবেছিল এগুলি ভিন্ন উদাহরণ।
এলভিন

2
হ্যাঁ. এটি ঘটে যদি, উদাহরণস্বরূপ, সম্পর্কিত অবজেক্টের আইডি অন্তর্ভুক্ত না করা হয় (যেমন এটি @ জসনআইগনোর দ্বারা উপেক্ষা করা হয়েছে)। হাইবারনেটের সম্পর্কিত সত্তা সনাক্ত করার কোনও উপায় নেই, তাই এটি এটি সংরক্ষণ করতে চায়।
রোরি স্টম্পফ

36

ভূমিকা

আমি জেপিএ এবং হাইবারনেট ব্যবহার করার সময় এই নিবন্ধে যেমনটি ব্যাখ্যা করেছি , সত্তা নিম্নলিখিত 4 টির মধ্যে একটিতে থাকতে পারে:

  • নতুন - একটি সদ্য নির্মিত বস্তু যা হাইবারনেট সেশন (ওরফে পার্সিস্ট্যান্স প্রসঙ্গে) এর সাথে যুক্ত হয় নি এবং কোনও ডাটাবেস টেবিল সারিতে ম্যাপ করা হয়নি তা নতুন বা ক্ষণস্থায়ী অবস্থায় বিবেচিত হয়।

    অবিচল থাকার জন্য আমাদের হয় স্পষ্টভাবে persistপদ্ধতিটি কল করতে হবে বা ট্রানজিটিভ অধ্যবসায়ের প্রক্রিয়াটি ব্যবহার করতে হবে।

  • জেদি - একটি ক্রমাগত সত্তা একটি ডাটাবেস টেবিলের সারিতে সঙ্গে যুক্ত করা হয়েছে এবং এটি বর্তমানে চলমান অধ্যবসায় প্রসঙ্গ দ্বারা পরিচালিত হচ্ছে।

    এই জাতীয় সত্তায় যে কোনও পরিবর্তন করা হয়েছে তা সনাক্ত করে ডেটাবেজে প্রচার করা হচ্ছে (সেশন ফ্লাশ-সময় চলাকালীন)।

  • বিচ্ছিন্ন - একবার চলমান দৃistence়প্রত্যক্ষ প্রসঙ্গটি বন্ধ হয়ে গেলে পূর্ববর্তী সমস্ত পরিচালিত সত্তা বিচ্ছিন্ন হয়ে যায়। ধারাবাহিক পরিবর্তনগুলি আর ট্র্যাক করা হবে না এবং কোনও স্বয়ংক্রিয় ডাটাবেস সিঙ্ক্রোনাইজেশন ঘটবে না।

  • সরানো হয়েছে - যদিও জেপিএ দাবি করেছে যে পরিচালিত সত্তাগুলি কেবল অপসারণের অনুমতি দেওয়া হয়েছে, হাইবারনেট বিচ্ছিন্ন সত্তাও মুছে ফেলতে পারে (তবে কেবল একটি removeপদ্ধতি কলের মাধ্যমে )।

সত্তার রাষ্ট্রের রূপান্তর

এক রাজ্য থেকে অন্য কোনো সত্তার সরাতে, আপনি ব্যবহার করতে পারেন persist, removeবা mergeপদ্ধতি।

জেপিএ সত্তা রাজ্য

সমস্যা ঠিক করা

আপনি আপনার প্রশ্নে যে বিষয়টি বর্ণনা করছেন:

object references an unsaved transient instance - save the transient instance before flushing

নতুন রাজ্যে কোনও সত্তাকে ম্যানেজড রাজ্যে থাকা সত্তার সাথে যুক্ত করার কারণে ঘটে ।

আপনি যখন পিতামাতার সত্তার এক থেকে একাধিক সংগ্রহে কোনও শিশু সত্তাকে সংযুক্ত করছেন তখন এটি ঘটতে পারে এবং সংগ্রহটি cascadeসত্তাটির স্থিতিশীল রূপান্তর করে না ।

সুতরাং, যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , আপনি এই সত্তা সংস্থায় ক্যাসকেড যুক্ত করে এটি ঠিক করতে পারেন যা এই ব্যর্থতাটিকে ট্রিগার করেছিল:

@OneToOneসমিতি

@OneToOne(
    mappedBy = "post",
    orphanRemoval = true,
    cascade = CascadeType.ALL)
private PostDetails details;

গুণটির CascadeType.ALLজন্য আমরা যে মানটি যুক্ত করেছি তা লক্ষ্য করুন cascade

@OneToManyসমিতি

@OneToMany(
    mappedBy = "post", 
    orphanRemoval = true,
    cascade = CascadeType.ALL)
private List<Comment> comments = new ArrayList<>();

আবার, দ্বিদলীয় সমিতিগুলির CascadeType.ALLজন্য উপযুক্ত ।@OneToMany

এখন, ক্যাসকেডটি একটি দ্বিপাক্ষিকভাবে সঠিকভাবে কাজ করার জন্য, আপনার পিতামাতা এবং শিশুদের সমিতিগুলি সিঙ্কে রয়েছে তাও নিশ্চিত করতে হবে।

পরীক্ষা করে দেখুন এই নিবন্ধটি সবচেয়ে ভালো উপায় এই লক্ষ্য অর্জন করা হল তার সম্পর্কে আরো বিস্তারিত জানার জন্য।

@ManyToManyসমিতি

@ManyToMany(
    mappedBy = "authors",
    cascade = {
        CascadeType.PERSIST, 
        CascadeType.MERGE
    }
)
private List<Book> books = new ArrayList<>();

কোনও @ManyToManyসংস্থায়, আপনি ব্যবহার করতে পারবেন না CascadeType.ALLবা orphanRemovalএটি মুছে ফেলা সত্তা রাষ্ট্রের রূপান্তরকে একজন পিতা বা মাতা থেকে অন্য পিতামাতার সত্তায় প্রচার করবে।

অতএব, @ManyToManyসংঘের জন্য , আপনি সাধারণত CascadeType.PERSISTবা CascadeType.MERGEঅপারেশনগুলিকে ক্যাসকেড করেন । বিকল্পভাবে, আপনি এটি DETACHবা প্রসারিত করতে পারেন REFRESH

@ManyToManyঅ্যাসোসিয়েশন ম্যাপ করার সর্বোত্তম উপায় সম্পর্কে আরও তথ্যের জন্য , এই নিবন্ধটিও দেখুন


সম্পূর্ণ এবং ধারাবাহিক ব্যাখ্যা! ভাল কাজ!
শীত

আপনি আমার হাইবারনেট টিউটোরিয়ালে এ জাতীয় শত শত বিশদ বিবরণ পেতে পারেন ।
ভ্লাদ মিহলসিয়া

30

অথবা, আপনি যা চান তা অর্জন করতে যদি ন্যূনতম "ক্ষমতা" ব্যবহার করতে চান (যেমন আপনি যদি ক্যাসকেড মোছা না চান), ব্যবহার করুন

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

...

@Cascade({CascadeType.SAVE_UPDATE})
private Set<Child> children;

11
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ক্যাসকেডটাইপ.এল সব খুব বিস্তৃত
লিল্লিনাক্স

5
হাইবারনেট 5.2.8 হিসাবে, জেপিএ টীকাগুলির সাথে একই প্রভাব অর্জনের কোনও উপায় নেই বলে মনে হয়। উদাহরণস্বরূপ, @ManyToMany(cascade={PERSIST, MERGE, REFRESH, DETACH})(সরানো ছাড়া সমস্তগুলি) হাইবারনেটের মতো আপডেটগুলি ক্যাসকেড করে না CascadeType.SAVE_UPDATE
জ্যাকসাহ্নওয়াল্ড্ট

25

আমার ক্ষেত্রে এটি হচ্ছে না সৃষ্টি হয়েছিল CascadeTypeউপর @ManyToOneদ্বিমুখী সম্পর্ক পাশ। আরও ভালো হবে, আমি ছিল CascadeType.ALLউপর @OneToManyদিকে এবং এটি ছিল না @ManyToOne। সমস্যাটি সমাধান করার CascadeType.ALLজন্য যুক্ত করা হচ্ছে @ManyToOneএক থেকে বহু পক্ষ:

@OneToMany(cascade = CascadeType.ALL, mappedBy="globalConfig", orphanRemoval = true)
private Set<GlobalConfigScope>gcScopeSet;

একাধিক পক্ষ (সমস্যা সৃষ্টি করেছে)

@ManyToOne
@JoinColumn(name="global_config_id")
private GlobalConfig globalConfig;

একাধিক টু ওয়ান (যোগ করে স্থির করা হয়েছে CascadeType.PERSIST)

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="global_config_id")
private GlobalConfig globalConfig;

যদি আমি এটি এইভাবে করি, এবং প্যারেন্ট সত্তা সংরক্ষণ করি, যা ঘটছে তা আমার পিতামাতার টেবিলে দুটি সন্নিবেশ রয়েছে যা দুটি সারি। আমার মনে হয় এর কারণ আমাদের পিতা বা মাতা এবং শিশু উভয় সত্তার উপর ক্যাসকেড রয়েছে?
থিম প্রোগ্রামার

18

এটি এমন একটি অস্তিত্ব ধরে রাখতে গিয়ে আমার জন্য ঘটেছিল যেখানে ডেটাবেজে বিদ্যমান রেকর্ডটিতে @ ভার্সন (আশাবাদী লকিংয়ের জন্য) দিয়ে বর্ধিত ক্ষেত্রটির জন্য একটি নাল মান রয়েছে। ডাটাবেসে NULL মান 0 এ আপডেট করা এটি সংশোধন করে।


এটি একটি নতুন প্রশ্ন হওয়া উচিত এবং এটি একটি বাগ হিসাবে অন্তত বিভ্রান্তিকর ব্যতিক্রম হিসাবে যুক্ত করা উচিত। এটি আমার সমস্যার কারণ হয়ে দাঁড়িয়েছে।
বিএমএল

এটি আমার সমস্যার সমাধান করে
জাদ চাহিন 13

11

এটি ত্রুটির একমাত্র কারণ নয়। আমার কোডিংয়ে টাইপিংয়ের ত্রুটির জন্য আমি এখনই এটির মুখোমুখি হয়েছি, যা আমার বিশ্বাস, ইতিমধ্যে সংরক্ষিত কোনও সত্তার একটি মান সেট করুন।

X x2 = new X();
x.setXid(memberid); // Error happened here - x was a previous global entity I created earlier
Y.setX(x2);

ঠিক কোন পরিবর্তনশীল ত্রুটিটি ঘটায় তা খুঁজে পেয়ে আমি ত্রুটিটি চিহ্নিত করেছি (এই ক্ষেত্রে String xid)। আমি catchকোডের পুরো ব্লক ব্যবহার করেছি যা সত্তাটি সংরক্ষণ করে এবং ট্রেসগুলি মুদ্রিত করে।

{
   code block that performed the operation
} catch (Exception e) {
   e.printStackTrace(); // put a break-point here and inspect the 'e'
   return ERROR;
}

1
আমার একই সমস্যা। সামগ্রিকভাবে, আমি যখন স্থানীয়ভাবে সত্তাটি পুনরায় লোড করেছি, সম্পত্তি সেট করি, তারপরে সংরক্ষণ করা হয়, এটি দুর্দান্ত কাজ করে।
সিএস বালাজস হুঙ্গারি

8

Cascade.Allযতক্ষণ না আপনাকে সত্যি করতে হবে ততক্ষণ ব্যবহার করবেন না । Roleএবং Permissionদ্বি নির্দেশমূলক manyToManyসম্পর্ক আছে। তারপরে নিম্নলিখিত কোডটি সূক্ষ্মভাবে কাজ করবে

    Permission p = new Permission();
    p.setName("help");
    Permission p2 = new Permission();
    p2.setName("self_info");
    p = (Permission)crudRepository.save(p); // returned p has id filled in.
    p2 = (Permission)crudRepository.save(p2); // so does p2.
    Role role = new Role();
    role.setAvailable(true);
    role.setDescription("a test role");
    role.setRole("admin");
    List<Permission> pList = new ArrayList<Permission>();
    pList.add(p);
    pList.add(p2);
    role.setPermissions(pList);
    crudRepository.save(role);

যখন অবজেক্টটি কেবল একটি "নতুন" হয় তবে এটি একই ত্রুটি ছুঁড়ে মারবে।


1
100% সঠিক, ক্যাসকেড ll সবই অলস সমাধান এবং কেবলমাত্র যখন প্রয়োজন হয় তখন প্রয়োগ করা উচিত। প্রথমত, সত্তাটি ইতিমধ্যে উপস্থিত থাকলে, এটি বর্তমান সত্তা ব্যবস্থাপকটিতে লোড করা হয়েছে কিনা তা পরীক্ষা করুন it
রেনাটো মেন্ডেস

7

আপনার সংগ্রহটি যদি অযোগ্য হয় কেবল চেষ্টা করুন: object.SetYouColection(null);


এটি সম্পূর্ণ আমার সমস্যা ছিল। আমি কখনই অনুমান করতে পারতাম না যে আমাকে নিজেই এটি বাতিল করতে হবে।
ডেড্রন

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

5

আমার 2 সেন্ট যোগ করার জন্য, আমি ঘটনাক্রমে nullআইডি হিসাবে প্রেরণ করার সময় আমি এই একই সমস্যাটি পেয়েছি । নীচে কোডে আমার দৃশ্য চিত্রিত করা হয়েছে (এবং ওপিতে কোনও নির্দিষ্ট দৃশ্যের উল্লেখ করা হয়নি)

Employee emp = new Employee();
emp.setDept(new Dept(deptId)); // --> when deptId PKID is null, same error will be thrown
// calls to other setters...
em.persist(emp);

এখানে আমি বিভাগের আইডিটিকে নতুন কর্মচারী ইনস্ট্যান্টে প্রকৃতপক্ষে বিভাগের সত্তাটি না পেয়ে প্রথমে সেট করছি, কারণ আমি অন্য কোনও নির্বাচনী প্রশ্নের জবাবদিহি করতে চাই না।

কিছু পরিস্থিতিতে, deptIdপিকেআইডি nullকলিং পদ্ধতি থেকে আসছে এবং আমি একই ত্রুটি পাচ্ছি।

সুতরাং, nullপিকে আইডির জন্য মানগুলি দেখুন


কি যদি এটি অবিরাম হয়?
vipin cp

আমারও একই সমস্যা আছে আমার ডিপটিডআইটি যখন 0 হয় তখন আমি ব্যতিক্রম পাই 0 0 এর চেয়ে বড় অন্য কোনও মান। মজার বিষয় হ'ল আইডি = 0 দিয়ে আমার একটি ডিপ্ট আছে
গুস্তাভো

5

এই সমস্যাটি আমার তখন ঘটেছিল যখন আমি চিহ্নিত পদ্ধতিতে একটি নতুন সত্তা এবং সম্পর্কিত সত্তা তৈরি করেছি @Transactional, তারপরে সংরক্ষণের আগে একটি ক্যোয়ারী করলাম । প্রাক্তন

@Transactional
public someService() {
    Entity someEntity = new Entity();
    AssocaiatedEntity associatedEntity = new AssocaitedEntity();
    someEntity.setAssociatedEntity(associatedEntity);
    associatedEntity.setEntity(someEntity);

    // Performing any query was causing hibernate to attempt to persist the new entity. It would then throw an exception
    someDao.getSomething();

    entityDao.create(someEntity);
}

ঠিক করার জন্য, আমি নতুন সত্তা তৈরির আগে ক্যোরিটি সম্পাদন করেছি।


4

অন্য সমস্ত ভাল উত্তরের পাশাপাশি, যদি আপনি mergeকোনও বিষয় অবিরত রাখতে ব্যবহার করেন এবং ঘটনাক্রমে অভিভাবকের শ্রেণিতে অবজেক্টের মার্জড রেফারেন্সটি ব্যবহার করতে ভুলে যান তবে এটি ঘটতে পারে । নিম্নলিখিত উদাহরণ বিবেচনা করুন

merge(A);
B.setA(A);
persist(B);

এই ক্ষেত্রে, আপনি মার্জ করে Aতবে মার্জ হওয়া অবজেক্টটি ব্যবহার করতে ভুলে যান A। সমস্যা সমাধানের জন্য আপনাকে অবশ্যই কোডটি পুনরায় লিখতে হবে।

A=merge(A);//difference is here
B.setA(A);
persist(B);

3

আমি ব্যবহার করার সময় এই ত্রুটিটি পাই

getSession().save(object)

তবে আমি যখন ব্যবহার করি তখন কোনও সমস্যা নেই

getSession().saveOrUpdate(object) 

3

আমিও একই পরিস্থিতির মুখোমুখি হয়েছি। সম্পত্তির উপরে টিকা রচনাটি সেট করে এটি অনুরোধ করা ব্যতিক্রমটি সমাধান করেছে।

ব্যতিক্রম আমি মুখোমুখি।

Exception in thread "main" java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.model.Car_OneToMany

কাটিয়ে উঠতে, আমি যে টীকাটি ব্যবহার করেছি।

    @OneToMany(cascade = {CascadeType.ALL})
    @Column(name = "ListOfCarsDrivenByDriver")
    private List<Car_OneToMany> listOfCarsBeingDriven = new ArrayList<Car_OneToMany>();

হাইবারনেট কী ব্যতিক্রম ছুঁড়ে ফেলেছে:

এই ব্যতিক্রমটি আপনার কনসোলে ফেলে দেওয়া হয়েছে কারণ আমি প্যারেন্ট অবজেক্টের সাথে চাইল্ড অবজেক্টটি সংযুক্ত করছি সেই মুহুর্তে ডাটাবেসে উপস্থিত নেই।

সরবরাহ করে @OneToMany(cascade = {CascadeType.ALL}), এটি হাইবারনেটকে প্যারেন্ট অবজেক্টটি সংরক্ষণ করার সময় তাদের ডাটাবেসে সংরক্ষণ করতে বলে।


2

সম্পূর্ণতার জন্য: এ

org.hibernate.TransientPropertyValueException 

বার্তা সহ

object references an unsaved transient instance - save the transient instance before flushing

এছাড়াও ঘটবে যখন আপনি জিদ / অন্য সত্তা যা করা ঘটবে একটি রেফারেন্স সহ একটি সত্তা একত্রীকরণ চেষ্টা বিচ্ছিন্ন


1

অন্য একটি সম্ভাব্য কারণ: আমার ক্ষেত্রে, আমি বাবা-মাকে বাঁচানোর আগে একেবারে নতুন সত্তায় বাচ্চাকে বাঁচানোর চেষ্টা করছিলাম।

কোডটি ইউজার জাভা মডেলে এই জাতীয় কিছু ছিল:

this.lastName = lastName;
this.isAdmin = isAdmin;
this.accountStatus = "Active";
this.setNewPassword(password);
this.timeJoin = new Date();
create();

সেটনিউপাসওয়ার্ড () পদ্ধতিটি একটি পাসওয়ার্ডহিসটরি রেকর্ড তৈরি করে এবং এটি ব্যবহারকারীর ইতিহাস সংগ্রহের সাথে যুক্ত করে। যেহেতু তৈরি () বিবৃতিটি পিতামাতার জন্য এখনও কার্যকর করা হয়নি, এটি এখনও সত্তা না এমন একটি সত্তার সংকলনে সংরক্ষণ করার চেষ্টা করছিল। এটি ঠিক করার জন্য আমাকে যা করতে হয়েছিল তা হ'ল () তৈরি করার জন্য কলটির পরে সেট নিউপ্যাসওয়ার্ড () কলটি সরিয়ে নেওয়া।

this.lastName = lastName;
this.isAdmin = isAdmin;
this.accountStatus = "Active";
this.timeJoin = new Date();
create();
this.setNewPassword(password);

1

হাইবারনেটে এই ত্রুটি দেখা দিতে পারে এমন আরও একটি সম্ভাবনা রয়েছে। আপনি Aকোনও সংযুক্ত সত্তায় আপনার অবজেক্টের অনিরাপিত রেফারেন্স সেট করতে Bপারেন এবং অবজেক্ট অব্যাহত রাখতে চান C। এমনকি এই ক্ষেত্রেও আপনি পূর্বোক্ত ত্রুটিটি পাবেন।


1

যদি আপনি স্প্রিং ডেটা জেপিএ ব্যবহার করেন তবে @Transactionalআপনার পরিষেবা বাস্তবায়নের সাথে যুক্ত টিকাদান সমস্যার সমাধান করবে।


1

আমি মনে করি কারণ আপনি এমন একটি অবজেক্টের অবিচল থাকার চেষ্টা করেছেন যা অন্য কোনও অবজেক্টের রেফারেন্স রয়েছে যা এখনও অবিরত নেই, এবং তাই এটি "ডিবি পাশ" দিয়ে একটি সারি রেফারেন্স রাখার চেষ্টা করে যা বিদ্যমান নেই


0

এই সমস্যাটি সমাধানের সহজ উপায় হ'ল উভয় সত্তাকেই সংরক্ষণ করা। প্রথমে সন্তানের সত্তা সংরক্ষণ করুন এবং তারপরে পিতামাতার সত্তা সংরক্ষণ করুন। কারণ প্যারেন্ট সত্তা বিদেশী কী মানের জন্য শিশু সত্তার উপর নির্ভরশীল।

এক থেকে এক সম্পর্কের সহজ পরীক্ষার নীচে

insert into Department (name, numOfemp, Depno) values (?, ?, ?)
Hibernate: insert into Employee (SSN, dep_Depno, firstName, lastName, middleName, empno) values (?, ?, ?, ?, ?, ?)

Session session=sf.openSession();
        session.beginTransaction();
        session.save(dep);
        session.save(emp);

1
এটি বিপরীত - শিশু সত্তা এফকে মান ধারণ করে এবং পিতামাতার উপর নির্ভর করে তাই আপনাকে প্রথমে পিতামাতাকে সংরক্ষণ করতে হবে! কোড ব্লকে আপনার ঠিক আছে।
সোবার

0

ত্রুটির একটি সম্ভাব্য কারণ হ'ল পিতামাতার সত্তার মান নির্ধারণের অস্তিত্ব; উদাহরণস্বরূপ বিভাগ-কর্মচারীদের সম্পর্কের জন্য ত্রুটি সমাধানের জন্য আপনাকে এটি লিখতে হবে:

Department dept = (Department)session.load(Department.class, dept_code); // dept_code is from the jsp form which you get in the controller with @RequestParam String department
employee.setDepartment(dept);

0

এই ত্রুটির অনেক সম্ভাবনা রয়েছে অন্য কিছু সম্ভাবনা অ্যাড পৃষ্ঠা বা সম্পাদনা পৃষ্ঠাতেও রয়েছে। আমার ক্ষেত্রে আমি একটি বস্তু অ্যাডভান্সসালারি সংরক্ষণ করার চেষ্টা করছিলাম। সমস্যাটি হ'ল সম্পাদনা করার সময় অ্যাডভান্সস্যালারি কর্মচারী e এমপ্লয়েই_আইডিটি শূন্য হয় কারণ সম্পাদনা করার সময় আমি কর্মচারী.ইম্পলয়ে_আইডি সেট করি নি। আমি একটি গোপন ক্ষেত্র তৈরি করে সেট করেছি। আমার কোড একদম ঠিক আছে।

    @Entity(name = "ic_advance_salary")
    @Table(name = "ic_advance_salary")
    public class AdvanceSalary extends BaseDO{

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Integer id;

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "employee_id", nullable = false)
        private Employee employee;

        @Column(name = "employee_id", insertable=false, updatable=false)
        @NotNull(message="Please enter employee Id")
        private Long employee_id;

        @Column(name = "advance_date")
        @DateTimeFormat(pattern = "dd-MMM-yyyy")
        @NotNull(message="Please enter advance date")
        private Date advance_date;

        @Column(name = "amount")
        @NotNull(message="Please enter Paid Amount")
        private Double amount;

        @Column(name = "cheque_date")
        @DateTimeFormat(pattern = "dd-MMM-yyyy")
        private Date cheque_date;

        @Column(name = "cheque_no")
        private String cheque_no;

        @Column(name = "remarks")
        private String remarks;

        public AdvanceSalary() {
        }

        public AdvanceSalary(Integer advance_salary_id) {
            this.id = advance_salary_id;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public Employee getEmployee() {
            return employee;
        }

        public void setEmployee(Employee employee) {
            this.employee = employee;
        }


        public Long getEmployee_id() {
            return employee_id;
        }

        public void setEmployee_id(Long employee_id) {
            this.employee_id = employee_id;
        }

    }

0

আমি যখন এই পিতা-মাতার বিষয় অব্যাহত রাখি না তবে আমি শিশুটিকে বাঁচিয়েছিলাম তখন আমি এই ব্যতিক্রমটির মুখোমুখি হয়েছি। সমস্যাটি সমাধান করার জন্য, একই সেশনে আমি শিশু এবং পিতা-মাতা উভয় অবজেক্টকে জোর দিয়েছি এবং পিতামাতার উপর ক্যাসকেডটাইপ.এলএল ব্যবহার করেছি।


0

কেস 1: যখন আমি পিতামাতা তৈরি করার চেষ্টা করছিলাম এবং তার সন্তানের সেই পিতামাতার রেফারেন্সটি সংরক্ষণ করার চেষ্টা করছিলাম এবং তারপরে অন্য কোনও ডিলেট / আপডেট আপডেট (জেপিকিউএল) ছিলাম তখন আমি এই ব্যতিক্রম পাচ্ছিলাম। সুতরাং আমি পিতা-মাতার তৈরির পরে এবং একই পিতামাতার রেফারেন্স ব্যবহার করে শিশু তৈরির পরে সদ্য নির্মিত সত্তাটি ফ্লাশ () করছি। এটা আমার জন্য কাজ করেছে।

কেস 2:

অভিভাবক শ্রেণি

public class Reference implements Serializable {

    @Id
    @Column(precision=20, scale=0)
    private BigInteger id;

    @Temporal(TemporalType.TIMESTAMP)
    private Date modifiedOn;

    @OneToOne(mappedBy="reference")
    private ReferenceAdditionalDetails refAddDetails;
    . 
    .
    .
}

শিশু শ্রেণি:

public class ReferenceAdditionalDetails implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @OneToOne
    @JoinColumn(name="reference",referencedColumnName="id")
    private Reference reference;

    private String preferedSector1;
    private String preferedSector2;
    .
    .

}

উপরের ক্ষেত্রে যেখানে পিতা বা মাতা (রেফারেন্স) এবং সন্তানের (ReferencesAdditionalDetails) ওয়ানটোন সম্পর্ক রয়েছে এবং আপনি যখন রেফারেন্স সত্তা তৈরির চেষ্টা করবেন এবং তারপরে তার সন্তানের (ReferencesAdditionalDetails) এটি আপনাকে একই ব্যতিক্রম করবে same সুতরাং ব্যতিক্রম এড়াতে আপনাকে শিশু শ্রেণির জন্য বাতিল করতে হবে এবং তারপরে অভিভাবক তৈরি করতে হবে S (নমুনা কোড)

.
.
reference.setRefAddDetails(null);
reference = referenceDao.create(reference);
entityManager.flush();
.
.

0

আমার সমস্যা @BeforeEachJUnit সম্পর্কিত ছিল । এমনকি যদি আমি সম্পর্কিত সংস্থাগুলি (আমার ক্ষেত্রে @ManyToOne) সংরক্ষণ করি তবে আমিও একই ত্রুটি পেয়েছি।

সমস্যাটি আমার পিতামাতার মধ্যে থাকা ক্রমগুলির সাথে একরকম সম্পর্কিত। যদি আমি সেই বৈশিষ্ট্যটির জন্য মান নির্ধারণ করি, সমস্যাটি সমাধান করা হবে।

যাত্রা। যদি আমার সত্তা প্রশ্ন থাকে যাতে কয়েকটি বিভাগ (এক বা একাধিক) থাকতে পারে এবং সত্তা প্রশ্নটির ক্রম রয়েছে:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "feedbackSeq")
@Id
private Long id;

আমি মান নির্ধারণ করতে হবে question.setId(1L);


0

আপনার বেস ক্লাসে কেবল আপনার ম্যাপিংয়ের কনস্ট্রাক্টর তৈরি করুন। যেমন আপনি সত্ত্বা এ-তে ওয়ান-টু-ওয়ান সম্পর্ক চান, সত্তা বি। যদি আপনার এটিকে বেস শ্রেণি হিসাবে নেওয়া হয় তবে A এর অবশ্যই যুক্তি হিসাবে কনস্ট্রাক্টরের বি থাকতে হবে।

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