আমি হাইবারনেটে নতুন এবং হাইবারনেট তৈরি করতে হাইবারনেট SessionFactoryবা জেপিএ ব্যবহার করব কিনা তা সম্পর্কে আমি নিশ্চিত নই । EntityManagerFactorySession
এই দুই এর মধ্যে পার্থক্য কি? এগুলির প্রতিটি ব্যবহার করার পক্ষে কি কি?
আমি হাইবারনেটে নতুন এবং হাইবারনেট তৈরি করতে হাইবারনেট SessionFactoryবা জেপিএ ব্যবহার করব কিনা তা সম্পর্কে আমি নিশ্চিত নই । EntityManagerFactorySession
এই দুই এর মধ্যে পার্থক্য কি? এগুলির প্রতিটি ব্যবহার করার পক্ষে কি কি?
উত্তর:
পছন্দ EntityManagerFactoryএবং EntityManager। তারা জেপিএ মান দ্বারা সংজ্ঞায়িত করা হয়।
SessionFactoryএবং Sessionহাইবারনেট-নির্দিষ্ট। EntityManagerফণা অধীন হাইবারনেট অধিবেশন ডাকে। এবং যদি আপনার কিছু নির্দিষ্ট বৈশিষ্ট্য প্রয়োজন হয় যা এর মধ্যে পাওয়া যায় না EntityManager, আপনি ফোন করে সেশনটি গ্রহণ করতে পারেন:
Session session = entityManager.unwrap(Session.class);
Sessionথেকে EntityManager, যেমন একই SessionFactory.getCurrentSession()? আমি বলতে চাইছি, এটি Sessionইতিমধ্যে তৈরি না হলে এটি নতুন খুলবে ? এটি কীভাবে বহুতল পরিবেশে কাজ করে?
আমি এটি যুক্ত করতে চাই আপনি যে getDelegate()পদ্ধতি থেকে কল করে হাইবারনেটের অধিবেশনটি পেতে পারেন EntityManager।
উদা:
Session session = (Session) entityManager.getDelegate();
আমি জেপিএ 2 EntityManagerএপিআইকে বেশি পছন্দ করি SessionFactoryকারণ এটি আরও আধুনিক বোধ করে। একটি সহজ উদাহরণ:
JPA:
@PersistenceContext
EntityManager entityManager;
public List<MyEntity> findSomeApples() {
return entityManager
.createQuery("from MyEntity where apples=7", MyEntity.class)
.getResultList();
}
SessionFactory:
@Autowired
SessionFactory sessionFactory;
public List<MyEntity> findSomeApples() {
Session session = sessionFactory.getCurrentSession();
List<?> result = session.createQuery("from MyEntity where apples=7")
.list();
@SuppressWarnings("unchecked")
List<MyEntity> resultCasted = (List<MyEntity>) result;
return resultCasted;
}
আমি মনে করি এটি স্পষ্ট যে প্রথমটি পরিষ্কার দেখায় এবং এটি পরীক্ষা করা আরও সহজ কারণ এনটিটিম্যানেজারটি সহজেই উপহাস করা যায়।
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
অ্যান্টি ম্যানেজারফ্যাক্টরি অ্যাপ্রোচ ব্যবহার করে আমাদের কোনও প্রকারের কনফিগারেশন ছাড়াই @PrePersist, @ PostPersist, @ PreUpdate এর মতো কলব্যাক পদ্ধতি টীকা ব্যবহার করতে দেয়।
সেশনফ্যাক্টরি ব্যবহার করার সময় অনুরূপ কলব্যাকগুলি ব্যবহার করতে অতিরিক্ত প্রচেষ্টা প্রয়োজন require
SessionFactory বনাম EntityManagerFactoryহাইবারনেট ইউজার গাইডে আমি যেমন ব্যাখ্যা করেছি , হাইবারনেট SessionFactoryজেপিএ বাড়িয়েছে EntityManagerFactory, যেমনটি নিম্নলিখিত চিত্রটি দ্বারা চিত্রিত হয়েছে:
সুতরাং, এটি SessionFactoryএকটি জেপিএও EntityManagerFactory।
SessionFactoryএবং উভয়ই EntityManagerFactoryসত্তাকে মেটাডেটা ম্যাপিং করে এবং আপনাকে একটি হাইবারনেট Sessionবা এ তৈরি করতে দেয় EntityManager।
Session বনাম EntityManagerঠিক যেমন SessionFactoryএবং EntityManagerFactoryহাইবারনেট Sessionজেপিএ প্রসারিত করে EntityManager। সুতরাং, দ্বারা সংজ্ঞায়িত সমস্ত পদ্ধতি EntityManagerহাইবারনেটে উপলব্ধ Session।
Sessionএবং `EntityManager অনুবাদ সত্তা রাষ্ট্র ট্রানজিশন এসকিউএল স্টেটমেন্ট মধ্যে, নির্বাচন ঢোকান, আপডেট মত করে এবং মোছে।
কোনও জেপিএ বা হাইবারনেট অ্যাপ্লিকেশন বুটস্ট্র্যাপ করার সময় আপনার দুটি পছন্দ থাকে:
SessionFactoryমাধ্যমে একটি তৈরি করতে পারেন BootstrapServiceRegistryBuilder। আপনি যদি বসন্ত ব্যবহার করছেন তবে এই গিটহাব উদাহরণLocalSessionFactoryBean দ্বারা চিত্রিত হিসাবে হাইবারনেট বুটস্ট্র্যাপটি এর মাধ্যমে সম্পন্ন হবে ।EntityManagerFactoryমাধ্যমে একটি জেপিএ তৈরি করতে পারেন । যদি আপনি স্প্রিং ব্যবহার করছেন, জেপিএ বুটস্ট্র্যাপটি এই গিটহাব উদাহরণ দ্বারা চিত্রিত হিসাবে, এর মাধ্যমে সম্পন্ন হবে ।PersistenceEntityManagerFactoryBuilderLocalContainerEntityManagerFactoryBeanজেপিএর মাধ্যমে বুটস্ট্র্যাপিং পছন্দ করা উচিত। এর কারণ, জেপিএ FlushModeType.AUTOউত্তরাধিকারের চেয়ে অনেক ভাল পছন্দ FlushMode.AUTO, যা আপনার এস -কিউএল কোয়েরিগুলির জন্য পড়া-লেখার ধারাবাহিকতা ভঙ্গ করে ।
এছাড়াও, আপনি যদি জেপিএর মাধ্যমে বুটস্ট্র্যাপ করেন এবং আপনি টীকাটি EntityManagerFactoryদিয়ে ইনজেকশন দিয়েছেন @PersistenceUnit:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
পদ্ধতিটি Sessionfactoryব্যবহার করে আপনি সহজেই অন্তর্নিহিত অ্যাক্সেস পেতে পারেন unwrap:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
জেপিএ নিয়েও একই কাজ করা যেতে পারে EntityManager। যদি আপনি টীকাটি EntityManagerদিয়ে ইনজেক্ট করেন @PersistenceContext:
@PersistenceContext
private EntityManager entityManager;
পদ্ধতিটি Sessionব্যবহার করে আপনি সহজেই অন্তর্নিহিত অ্যাক্সেস পেতে পারেন unwrap:
Session session = entityManager.unwrap(Session.class);
সুতরাং, আপনি JPA মাধ্যমে বুটস্ট্র্যাপ, ব্যবহার করা উচিত EntityManagerFactoryএবং EntityManager, এবং শুধুমাত্র তাদের যুক্ত হাইবারনেট ইন্টারফেসগুলি সেই মোড়ক খোলা যখন তোমার মত, কিছু হাইবারনেট-নির্দিষ্ট পদ্ধতি JPA উপলভ্য নয় অ্যাক্সেস পেতে চান তার প্রাকৃতিক আইডেন্টিফায়ার মাধ্যমে সত্তা আনার সময় ।
সত্তা ম্যানেজার ব্যবহার করে, কোডটি হাইবারনেটের সাথে আর শক্তভাবে জুড়ে দেওয়া হবে না। তবে এর জন্য, ব্যবহারে আমাদের ব্যবহার করা উচিত:
javax.persistence.EntityManager
পরিবর্তে
org.hibernate.ejb.HibernateEntityManager
একইভাবে, অ্যান্টিটি ম্যানেজারফ্যাক্টরীর জন্য জাভ্যাক্স ইন্টারফেস ব্যবহার করুন। এইভাবে, কোডটি আলগাভাবে মিলিত হয়। হাইবারনেটের চেয়ে আরও ভাল জেপিএ 2 বাস্তবায়ন থাকলে, স্যুইচিং করা সহজ হবে। চরম ক্ষেত্রে, আমরা হাইবারনেটএন্টিটি ম্যানেজারে কাস্ট করতে পারি could
ইন্টিটি ম্যানেজারফ্যাক্টরি হ'ল স্ট্যান্ডার্ড বাস্তবায়ন, সমস্ত বাস্তবায়ন জুড়ে এটি একই। আপনি যদি অন্য কোনও সরবরাহকারীর মতো আপনার ওআরএম স্থানান্তরিত করেন যেমন EclipseLink, লেনদেন পরিচালনার জন্য পদ্ধতির কোনও পরিবর্তন হবে না। বিপরীতে, আপনি হাইবারনেটের সেশন কারখানাটি ব্যবহার করেন, এটি হাইবারনেট এপিআইতে আবদ্ধ এবং নতুন বিক্রেত্রে স্থানান্তর করতে পারবেন না।
অ্যান্টিটি ম্যানেজার ইন্টারফেস হাইবারনেটে সেশনফ্যাক্টির মতো। Javax.persistance প্যাকেজের অধীনে সত্তা ম্যানেজার তবে org.hibernate.Sશન / সেশনফ্যাক্টরি প্যাকেজের অধীনে সেশন এবং সেশনফ্যাক্টরি।
সত্তা পরিচালক হ'ল জেপিএ নির্দিষ্ট এবং সেশন / সেশনফ্যাক্টরি হাইবারনেট নির্দিষ্ট।