হাইবারনেট সেশনফ্যাক্টরী বনাম জেপিএ সত্ত্বা ম্যানেজার ফ্যাক্টরি


251

আমি হাইবারনেটে নতুন এবং হাইবারনেট তৈরি করতে হাইবারনেট SessionFactoryবা জেপিএ ব্যবহার করব কিনা তা সম্পর্কে আমি নিশ্চিত নই । EntityManagerFactorySession

এই দুই এর মধ্যে পার্থক্য কি? এগুলির প্রতিটি ব্যবহার করার পক্ষে কি কি?


6
সদৃশ প্রশ্নের এই উত্তরটি খুব ভাল। stackoverflow.com/questions/23445830/...
Sanghyun লি

উত্তর:


365

পছন্দ EntityManagerFactoryএবং EntityManager। তারা জেপিএ মান দ্বারা সংজ্ঞায়িত করা হয়।

SessionFactoryএবং Sessionহাইবারনেট-নির্দিষ্ট। EntityManagerফণা অধীন হাইবারনেট অধিবেশন ডাকে। এবং যদি আপনার কিছু নির্দিষ্ট বৈশিষ্ট্য প্রয়োজন হয় যা এর মধ্যে পাওয়া যায় না EntityManager, আপনি ফোন করে সেশনটি গ্রহণ করতে পারেন:

Session session = entityManager.unwrap(Session.class);

2
@ ইলপিসু - আমি আসলে সুপারিশ করতে পারি না। আমি কেবলমাত্র অফিশিয়াল ডকুমেন্টেশনকে একটি শেখার সংস্থান হিসাবে ব্যবহার করেছি (কমপক্ষে গত 2 বছরে), তাই আমি আর নির্ভরযোগ্য কিছু জানি না। তবে ডকগুলি যথেষ্ট ভাল।
বোঝো

7
@ বোজো আমি জানি যে দেরি হয়ে গেছে তবে সেশনফ্যাক্টরি এবং সেশন ব্যবহারের ত্রুটিগুলি কী কী? কেন জেপিএ ব্যবহার পছন্দ? ধন্যবাদ
মিকেল মারাচে

12
@ মিকেলমার্যাচে হাইপারনেট এপিআই এর চেয়ে জেপিএর ব্যবহার পছন্দ করা উচিত, কারণ এটি জাভা এন্টারপ্রাইজ স্ট্যান্ডার্ড। জেপিএ ব্যবহার (এবং হাইবারনেট-নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার না করে নিজেকে এতে সীমাবদ্ধ করা) অ্যাপ্লিকেশন পোর্টেবিলিটি উন্নত করে, যেমন আপনার আবেদনের নূন্যতম পরিবর্তনের সাথে একটি ভিন্ন অধ্যবসায় কাঠামোতে স্যুইচ করার বিকল্প রয়েছে, যতক্ষণ না সেই কাঠামোটি জেপিএ মানকে মেনে চলে না ।
লাজলি ভ্যান ডেন হোইক

2
এটি কেবলমাত্র একটি এন্টারপ্রাইজ স্ট্যান্ডার্ডের কারণে আরও ভাল? আমি ওটা সন্দেহ করেছি. মানকগুলি সাধারণত বিকশিত হতে ধীর এবং জটিল হয়। বাস্তব জীবনের কিছু সুবিধা সম্পর্কে কী বলা যায়? জেপিএ ভাল কারণ এটিতে টাইপকিউয়ারি রয়েছে, আপনাকে পুরো জায়গা জুড়ে টাইপকাস্টিং করা বন্ধ করে দেয়।
বাস্তিয়ান ভয়েগট

1
এই পদ্ধতির পেতে হয় Sessionথেকে EntityManager, যেমন একই SessionFactory.getCurrentSession()? আমি বলতে চাইছি, এটি Sessionইতিমধ্যে তৈরি না হলে এটি নতুন খুলবে ? এটি কীভাবে বহুতল পরিবেশে কাজ করে?
সর্বেশ

32

আমি এটি যুক্ত করতে চাই আপনি যে getDelegate()পদ্ধতি থেকে কল করে হাইবারনেটের অধিবেশনটি পেতে পারেন EntityManager

উদা:

Session session = (Session) entityManager.getDelegate();

28
দয়া করে মনে রাখবেন unwrap()হয় পছন্দ করা ওভার getDelegate(): জাভা ডক্স অনুযায়ী javaee 6 , এবং javaee 7
ryenus

22

আমি জেপিএ 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;
}

আমি মনে করি এটি স্পষ্ট যে প্রথমটি পরিষ্কার দেখায় এবং এটি পরীক্ষা করা আরও সহজ কারণ এনটিটিম্যানেজারটি সহজেই উপহাস করা যায়।


30
আপনি চাইলে যে কোনও কোডকে জটিল করে তুলতে পারেন। return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
wst

আপনি কীভাবে সরাসরি সত্তা ম্যানেজার পেয়েছেন এবং আপনি প্রদর্শন করছেন যে সেশন আনতে আপনাকে সেশনফ্যাক্টরি ব্যবহার করতে হবে ..: ডি
জাভালিয়নার

21

অ্যান্টি ম্যানেজারফ্যাক্টরি অ্যাপ্রোচ ব্যবহার করে আমাদের কোনও প্রকারের কনফিগারেশন ছাড়াই @PrePersist, @ PostPersist, @ PreUpdate এর মতো কলব্যাক পদ্ধতি টীকা ব্যবহার করতে দেয়।

সেশনফ্যাক্টরি ব্যবহার করার সময় অনুরূপ কলব্যাকগুলি ব্যবহার করতে অতিরিক্ত প্রচেষ্টা প্রয়োজন require

সম্পর্কিত হাইবারনেট ডক্সটি এখানে এবং এখানে পাওয়া যাবে

সম্পর্কিত এসওএফ প্রশ্ন এবং বসন্ত ফোরাম আলোচনা


21

SessionFactory বনাম EntityManagerFactory

হাইবারনেট ইউজার গাইডে আমি যেমন ব্যাখ্যা করেছি , হাইবারনেট SessionFactoryজেপিএ বাড়িয়েছে EntityManagerFactory, যেমনটি নিম্নলিখিত চিত্রটি দ্বারা চিত্রিত হয়েছে:

জেপিএ এবং হাইবারনেট সম্পর্ক

সুতরাং, এটি SessionFactoryএকটি জেপিএও EntityManagerFactory

SessionFactoryএবং উভয়ই EntityManagerFactoryসত্তাকে মেটাডেটা ম্যাপিং করে এবং আপনাকে একটি হাইবারনেট Sessionবা এ তৈরি করতে দেয় EntityManager

Session বনাম EntityManager

ঠিক যেমন SessionFactoryএবং EntityManagerFactoryহাইবারনেট Sessionজেপিএ প্রসারিত করে EntityManager। সুতরাং, দ্বারা সংজ্ঞায়িত সমস্ত পদ্ধতি EntityManagerহাইবারনেটে উপলব্ধ Session

Sessionএবং `EntityManager অনুবাদ সত্তা রাষ্ট্র ট্রানজিশন এসকিউএল স্টেটমেন্ট মধ্যে, নির্বাচন ঢোকান, আপডেট মত করে এবং মোছে।

হাইবারনেট বনাম জেপিএ বুটস্ট্র্যাপ

কোনও জেপিএ বা হাইবারনেট অ্যাপ্লিকেশন বুটস্ট্র্যাপ করার সময় আপনার দুটি পছন্দ থাকে:

  1. আপনি হাইবারনেট নেটিভ মেকানিজমের মাধ্যমে বুটস্ট্র্যাপ করতে পারেন এবং এর SessionFactoryমাধ্যমে একটি তৈরি করতে পারেন BootstrapServiceRegistryBuilder। আপনি যদি বসন্ত ব্যবহার করছেন তবে এই গিটহাব উদাহরণLocalSessionFactoryBean দ্বারা চিত্রিত হিসাবে হাইবারনেট বুটস্ট্র্যাপটি এর মাধ্যমে সম্পন্ন হবে ।
  2. অথবা, আপনি ক্লাস বা এর 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 উপলভ্য নয় অ্যাক্সেস পেতে চান তার প্রাকৃতিক আইডেন্টিফায়ার মাধ্যমে সত্তা আনার সময়


2

সত্তা ম্যানেজার ব্যবহার করে, কোডটি হাইবারনেটের সাথে আর শক্তভাবে জুড়ে দেওয়া হবে না। তবে এর জন্য, ব্যবহারে আমাদের ব্যবহার করা উচিত:

javax.persistence.EntityManager

পরিবর্তে

org.hibernate.ejb.HibernateEntityManager

একইভাবে, অ্যান্টিটি ম্যানেজারফ্যাক্টরীর জন্য জাভ্যাক্স ইন্টারফেস ব্যবহার করুন। এইভাবে, কোডটি আলগাভাবে মিলিত হয়। হাইবারনেটের চেয়ে আরও ভাল জেপিএ 2 বাস্তবায়ন থাকলে, স্যুইচিং করা সহজ হবে। চরম ক্ষেত্রে, আমরা হাইবারনেটএন্টিটি ম্যানেজারে কাস্ট করতে পারি could


2

ইন্টিটি ম্যানেজারফ্যাক্টরি হ'ল স্ট্যান্ডার্ড বাস্তবায়ন, সমস্ত বাস্তবায়ন জুড়ে এটি একই। আপনি যদি অন্য কোনও সরবরাহকারীর মতো আপনার ওআরএম স্থানান্তরিত করেন যেমন EclipseLink, লেনদেন পরিচালনার জন্য পদ্ধতির কোনও পরিবর্তন হবে না। বিপরীতে, আপনি হাইবারনেটের সেশন কারখানাটি ব্যবহার করেন, এটি হাইবারনেট এপিআইতে আবদ্ধ এবং নতুন বিক্রেত্রে স্থানান্তর করতে পারবেন না।


1

অ্যান্টিটি ম্যানেজার ইন্টারফেস হাইবারনেটে সেশনফ্যাক্টির মতো। Javax.persistance প্যাকেজের অধীনে সত্তা ম্যানেজার তবে org.hibernate.Sશન / সেশনফ্যাক্টরি প্যাকেজের অধীনে সেশন এবং সেশনফ্যাক্টরি।

সত্তা পরিচালক হ'ল জেপিএ নির্দিষ্ট এবং সেশন / সেশনফ্যাক্টরি হাইবারনেট নির্দিষ্ট।


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