হাইবারনেট ব্যবহার করে অবজেক্টটি সংরক্ষণ করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি
object references an unsaved transient instance - save the transient instance before flushing
হাইবারনেট ব্যবহার করে অবজেক্টটি সংরক্ষণ করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি
object references an unsaved transient instance - save the transient instance before flushing
উত্তর:
আপনার সংগ্রহ ম্যাপিংয়ের ক্ষেত্রে আপনার (যদি cascade="all"
এক্সএমএল ব্যবহার করা হয়) বা cascade=CascadeType.ALL
(টীকাগুলি ব্যবহার করা হয় ) অন্তর্ভুক্ত করা উচিত ।
এটি ঘটায় কারণ আপনার সত্তায় একটি সংগ্রহ রয়েছে এবং সেই সংগ্রহে এক বা একাধিক আইটেম রয়েছে যা ডাটাবেসে উপস্থিত নেই। উপরের বিকল্পগুলি নির্দিষ্ট করে আপনি তাদের পিতামাতার সংরক্ষণের সময় ডাটাবেসে সেভ করতে হাইবারনেটকে বলে tell
আমি বিশ্বাস করি এটি কেবল পুনরাবৃত্ত উত্তর হতে পারে তবে কেবল স্পষ্ট করে বলতে গেলে আমি এটিকে একটি @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;
}
new MyEntity
ডেটাবেস থেকে সিঙ্ক্রোনাইজড উদাহরণ না পাওয়ার পরিবর্তে (এটি ডেটাবেজে সিঙ্ক্রোনাইজ না করে - ফ্লাশিং) তৈরি করেছেন। সেই উদাহরণটি ব্যবহার করে হাইবারনেট অনুসন্ধান করা আপনাকে অবহিত করে যে আপনি ডাটাবেসে যা প্রত্যাশা করছেন তা আপনার অ্যাপ্লিকেশনের স্মৃতিতে আলাদা রয়েছে। এই ক্ষেত্রে - কেবলমাত্র ডিবি থেকে আপনার সত্তা ইনস্ট্যান্সেন্সটি সিঙ্ক্রোনাইজ করুন / এটি ব্যবহার করুন। কোনও ক্যাসকেডটাইপ.এল এর দরকার নেই।
হাইবারনেট যখন মনে করে যে কোনও বস্তু আপনি সংরক্ষণ করছেন তার সাথে সম্পর্কিত যে কোনও জিনিস সংরক্ষণ করা দরকার তা যখন সংরক্ষণ করে তখন এটি ঘটে।
আমার এই সমস্যাটি ছিল এবং রেফারেন্স করা অবজেক্টে পরিবর্তনগুলি সংরক্ষণ করতে চাইনি তাই আমি চাইছিলাম ক্যাসকেডের ধরণটি কোনও নয়।
কৌশলটি হ'ল রেফারেন্স করা অবজেক্টের আইডি এবং VERSION সেট করা আছে যাতে হাইবারনেট মনে করেন না যে রেফারেন্স করা অবজেক্টটি একটি নতুন অবজেক্ট যা সংরক্ষণের প্রয়োজন। এটি আমার পক্ষে কাজ করেছে।
আপনি যে শ্রেণীর সাথে সম্পর্কিত বস্তুগুলি (এবং সম্পর্কিত বস্তুর সাথে সম্পর্কিত বস্তুগুলি) কাজ করার জন্য সংরক্ষণ করছেন সে সমস্ত সম্পর্কের সন্ধান করুন এবং নিশ্চিত করুন যে আইডি এবং VERSION বস্তু গাছের সমস্ত বস্তুতে সেট করা আছে।
আমি জেপিএ এবং হাইবারনেট ব্যবহার করার সময় এই নিবন্ধে যেমনটি ব্যাখ্যা করেছি , সত্তা নিম্নলিখিত 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
অ্যাসোসিয়েশন ম্যাপ করার সর্বোত্তম উপায় সম্পর্কে আরও তথ্যের জন্য , এই নিবন্ধটিও দেখুন ।
অথবা, আপনি যা চান তা অর্জন করতে যদি ন্যূনতম "ক্ষমতা" ব্যবহার করতে চান (যেমন আপনি যদি ক্যাসকেড মোছা না চান), ব্যবহার করুন
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
...
@Cascade({CascadeType.SAVE_UPDATE})
private Set<Child> children;
@ManyToMany(cascade={PERSIST, MERGE, REFRESH, DETACH})
(সরানো ছাড়া সমস্তগুলি) হাইবারনেটের মতো আপডেটগুলি ক্যাসকেড করে না CascadeType.SAVE_UPDATE
।
আমার ক্ষেত্রে এটি হচ্ছে না সৃষ্টি হয়েছিল 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;
এটি এমন একটি অস্তিত্ব ধরে রাখতে গিয়ে আমার জন্য ঘটেছিল যেখানে ডেটাবেজে বিদ্যমান রেকর্ডটিতে @ ভার্সন (আশাবাদী লকিংয়ের জন্য) দিয়ে বর্ধিত ক্ষেত্রটির জন্য একটি নাল মান রয়েছে। ডাটাবেসে NULL মান 0 এ আপডেট করা এটি সংশোধন করে।
এটি ত্রুটির একমাত্র কারণ নয়। আমার কোডিংয়ে টাইপিংয়ের ত্রুটির জন্য আমি এখনই এটির মুখোমুখি হয়েছি, যা আমার বিশ্বাস, ইতিমধ্যে সংরক্ষিত কোনও সত্তার একটি মান সেট করুন।
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;
}
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);
যখন অবজেক্টটি কেবল একটি "নতুন" হয় তবে এটি একই ত্রুটি ছুঁড়ে মারবে।
আপনার সংগ্রহটি যদি অযোগ্য হয় কেবল চেষ্টা করুন: object.SetYouColection(null);
আমার 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
পিকে আইডির জন্য মানগুলি দেখুন
এই সমস্যাটি আমার তখন ঘটেছিল যখন আমি চিহ্নিত পদ্ধতিতে একটি নতুন সত্তা এবং সম্পর্কিত সত্তা তৈরি করেছি @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);
}
ঠিক করার জন্য, আমি নতুন সত্তা তৈরির আগে ক্যোরিটি সম্পাদন করেছি।
অন্য সমস্ত ভাল উত্তরের পাশাপাশি, যদি আপনি merge
কোনও বিষয় অবিরত রাখতে ব্যবহার করেন এবং ঘটনাক্রমে অভিভাবকের শ্রেণিতে অবজেক্টের মার্জড রেফারেন্সটি ব্যবহার করতে ভুলে যান তবে এটি ঘটতে পারে । নিম্নলিখিত উদাহরণ বিবেচনা করুন
merge(A);
B.setA(A);
persist(B);
এই ক্ষেত্রে, আপনি মার্জ করে A
তবে মার্জ হওয়া অবজেক্টটি ব্যবহার করতে ভুলে যান A
। সমস্যা সমাধানের জন্য আপনাকে অবশ্যই কোডটি পুনরায় লিখতে হবে।
A=merge(A);//difference is here
B.setA(A);
persist(B);
আমিও একই পরিস্থিতির মুখোমুখি হয়েছি। সম্পত্তির উপরে টিকা রচনাটি সেট করে এটি অনুরোধ করা ব্যতিক্রমটি সমাধান করেছে।
ব্যতিক্রম আমি মুখোমুখি।
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})
, এটি হাইবারনেটকে প্যারেন্ট অবজেক্টটি সংরক্ষণ করার সময় তাদের ডাটাবেসে সংরক্ষণ করতে বলে।
অন্য একটি সম্ভাব্য কারণ: আমার ক্ষেত্রে, আমি বাবা-মাকে বাঁচানোর আগে একেবারে নতুন সত্তায় বাচ্চাকে বাঁচানোর চেষ্টা করছিলাম।
কোডটি ইউজার জাভা মডেলে এই জাতীয় কিছু ছিল:
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);
হাইবারনেটে এই ত্রুটি দেখা দিতে পারে এমন আরও একটি সম্ভাবনা রয়েছে। আপনি A
কোনও সংযুক্ত সত্তায় আপনার অবজেক্টের অনিরাপিত রেফারেন্স সেট করতে B
পারেন এবং অবজেক্ট অব্যাহত রাখতে চান C
। এমনকি এই ক্ষেত্রেও আপনি পূর্বোক্ত ত্রুটিটি পাবেন।
আমি মনে করি কারণ আপনি এমন একটি অবজেক্টের অবিচল থাকার চেষ্টা করেছেন যা অন্য কোনও অবজেক্টের রেফারেন্স রয়েছে যা এখনও অবিরত নেই, এবং তাই এটি "ডিবি পাশ" দিয়ে একটি সারি রেফারেন্স রাখার চেষ্টা করে যা বিদ্যমান নেই
এই সমস্যাটি সমাধানের সহজ উপায় হ'ল উভয় সত্তাকেই সংরক্ষণ করা। প্রথমে সন্তানের সত্তা সংরক্ষণ করুন এবং তারপরে পিতামাতার সত্তা সংরক্ষণ করুন। কারণ প্যারেন্ট সত্তা বিদেশী কী মানের জন্য শিশু সত্তার উপর নির্ভরশীল।
এক থেকে এক সম্পর্কের সহজ পরীক্ষার নীচে
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);
ত্রুটির একটি সম্ভাব্য কারণ হ'ল পিতামাতার সত্তার মান নির্ধারণের অস্তিত্ব; উদাহরণস্বরূপ বিভাগ-কর্মচারীদের সম্পর্কের জন্য ত্রুটি সমাধানের জন্য আপনাকে এটি লিখতে হবে:
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);
এই ত্রুটির অনেক সম্ভাবনা রয়েছে অন্য কিছু সম্ভাবনা অ্যাড পৃষ্ঠা বা সম্পাদনা পৃষ্ঠাতেও রয়েছে। আমার ক্ষেত্রে আমি একটি বস্তু অ্যাডভান্সসালারি সংরক্ষণ করার চেষ্টা করছিলাম। সমস্যাটি হ'ল সম্পাদনা করার সময় অ্যাডভান্সস্যালারি কর্মচারী 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;
}
}
আমি যখন এই পিতা-মাতার বিষয় অব্যাহত রাখি না তবে আমি শিশুটিকে বাঁচিয়েছিলাম তখন আমি এই ব্যতিক্রমটির মুখোমুখি হয়েছি। সমস্যাটি সমাধান করার জন্য, একই সেশনে আমি শিশু এবং পিতা-মাতা উভয় অবজেক্টকে জোর দিয়েছি এবং পিতামাতার উপর ক্যাসকেডটাইপ.এলএল ব্যবহার করেছি।
কেস 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();
.
.
আমার সমস্যা @BeforeEach
JUnit সম্পর্কিত ছিল । এমনকি যদি আমি সম্পর্কিত সংস্থাগুলি (আমার ক্ষেত্রে @ManyToOne
) সংরক্ষণ করি তবে আমিও একই ত্রুটি পেয়েছি।
সমস্যাটি আমার পিতামাতার মধ্যে থাকা ক্রমগুলির সাথে একরকম সম্পর্কিত। যদি আমি সেই বৈশিষ্ট্যটির জন্য মান নির্ধারণ করি, সমস্যাটি সমাধান করা হবে।
যাত্রা। যদি আমার সত্তা প্রশ্ন থাকে যাতে কয়েকটি বিভাগ (এক বা একাধিক) থাকতে পারে এবং সত্তা প্রশ্নটির ক্রম রয়েছে:
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "feedbackSeq")
@Id
private Long id;
আমি মান নির্ধারণ করতে হবে question.setId(1L);
আপনার বেস ক্লাসে কেবল আপনার ম্যাপিংয়ের কনস্ট্রাক্টর তৈরি করুন। যেমন আপনি সত্ত্বা এ-তে ওয়ান-টু-ওয়ান সম্পর্ক চান, সত্তা বি। যদি আপনার এটিকে বেস শ্রেণি হিসাবে নেওয়া হয় তবে A এর অবশ্যই যুক্তি হিসাবে কনস্ট্রাক্টরের বি থাকতে হবে।