تلفیق Hibernate و JPA

0 رأی
میانگین بازدید روزانه 0.43235 بازدید
تویه پروژه هامون ما یا از Hibernate استفاده میکنیم و یا از JPA (حالا اینکه hibernate میتونه Provider ی برای JPA باشه منظور نیست ) اما گاهی اوقات ما داریم از Hibenrate استفاده میکنیم ولی از JPA Annotation ها هم استفاده میکنیم این چه روشیه؟

ما یا از JPA استفاده میکنیم یا نه اینکه بخش از اون رو داشته باشیم معنی داره؟

این جواب ایا درسته که بگیم ما کتابخونه hibernate-entitymanager رو وارد میکنیم که JPA Feature ها رو بشناسه و وارد Hibernate کنه؟
سوال 1 سال قبل در تالار برنامه نویسی توسط یوری (426 امتیاز)

3 جواب

+2 رأی
JPA صرفا یک Specification ه. یعنی یسری دستورالعمل ک هیچ  پیاده سازی نداره. شما میتونید از JPA Annotation استفاده کنید که یک کلاس POJO رو بعنوان یک Entity معرفی کنید ولی تا زمانی که پیاده سازی برای JPA وجود نداشته باشد هیچ اتفاقی نمی افتد. Hibernate بعنوان پیاده ساز و یک Wrapper برای JPA عمل می کنه  که کتابخانه بسیار فراگیرتر تر از JPA هم داره. (میتونید از طریق EntityManager همون HibernateSession هم بگیرین، یعنی unwrapp کنین) تلفیقشون هم نمی تونیم بگیم اشتباهه. چون تو بعضی شرایط ممکنه JPA بهتر باشه و بعضی شرایط دیگه مجبور بشین از API هایبرنیت استفاده کنین. Annotation های JPA هم به نوعی مشخص کننده ی خود دستورالعمل کلی هستن که تو Specification اومده.
جواب 1 سال قبل توسط salar_ai (255 امتیاز)
جوابتون درسته اما برای سوالی مثل اینکه hibernate و jpa چیه و رابطشون چیه و کی از کدومشون استفاده کنیم داده شده  
اما سوال یکم متفاوت تره
اما تویه جوابتون گفتین  hibernate یک wrapper برای jpa هست رو میشه بیشتر توضیح بدین ممنون میشم
چون معمولا میگم hibernate یک provider یا پیاده ساز از jpa است
منظورم از wrapper دقیقا همین پیاده سازیه. یعنی شما وقتی از JPA API استفاده می کنین، در واقع اون چیزی که اتفاق می افته اینه که Library و API هایبرنیت فراخوانی میشه. مثل اینه که یه اینترفیس تعریف شده. شما وقتی متد رو فراخوانی می کنی، پیاده سازی متد در کلاس concrete کلاس پیاده ساز اجرا میشه. خب طبیعتا JPA مثل اون اینترفیس عمل میکنه و هایبرنیت نقش کلاس concrete رو اجرا میکنه.
0 رأی
JPA یه specification هست.از دید برنامه نویسی منظور از specification میشه api.در واقع هر specification برای کار خاصی بوجود اومده.مثلا همین jpa  برای راحت شدن کار با دیتابیسه.برنامه جاوایی ما با مفهوم آبجکت کار میکنه ولی دیتابیس ما درکی از آبجکت نداره و رابطه ای. و در واقع jpa میاد و این ناسازگاری رو پوشش میده تا برنامه نویس کارش راحت بشه.

نکته مهم در مورد specificatioin اینکه برای اینترفیس های موجود پیاده سازی وجود نداره.

گروه های نرم افزاری میان و پیاده سازی های مختلف ارائه میکنن.بهمین خاطره که برای هر specification پیاده سازی های متنوعی وجود داره.

 اونایی که specification رو پیاده سازی میکنن علاوه بر پیاده سازی اصل specification میتونن به اون  یه قابلیت هایی دیگه ای هم اضافه کنن.

در واقع hibernate اومده و علاو ه بر پیاده سازی jpa  یک سری کتابخونه دیگه هم در دسترس ما گذاشته. بهمین خاطر میگن hibernate  یک wrapper برای jpa بحساب میاد.
در مورد سوال شما زمانیکه از jpa annotation استفاده میکنید در واقع از پیاده سازی موجود در hibernate استفاده میشه.

اینکه شما فقط از jpa استفاده کنید( یعنی فقط از پیاده سازی jpa موجود در hibernate نه چیزی بیشتر) این امکان رو بهتون میده که در آینده بدون دستکاری کد بتونید jpa provider رو تغییر بدین.

والبته میتونید از تلفیق اونا هم استفاده کنید.ولی بدونید که شما دارید برنامه تون رو به یه jpa provider خاص وابسته می کنید.
جواب 1 سال قبل توسط HA (301 امتیاز)
ویرایش 1 سال قبل توسط HA
0 رأی
JPA چیزی نیست جزو مجموعه ای از API های استاندارد.

هرکدام از vendor ها اومدن این API ها روپیاده سازی کردند مانند:

Hibernate

EclipseLink

اما برای استفاده از Hibenrate توی پروژه تون شما دو روش در پیش دارید :

    استفاده از خود تکنولوژی Hibernate که برای اینکار نیاز دارید  فایل hibernate.cfg.xml رو توی پروژه تون داشته باشید و تعریفش کنید
    استفاده از JPA و مشخص کردن نوع پیاده سازی  در فایل Persistence.xml و در این فایل یک proprty وجود داره به صورت زیر درش دقیقا مشخص می کنید که از Hibernate می خوام استفاده کنم

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.2"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <!-- Define persistence unit -->
    <persistence-unit name="my-persistence-unit">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    </persistence-unit>
</persistence>

 

اما چه فرقی داره شما مستقیما سراغ خود تکنولوژی هایبرنت بروید یا از طریق JPA از این تکنولوژی استفاده کنید

باید بگم عمر هایبرنت خیلی بیشتر از JPA است  و پخته تراز اونه . خیلی چیزایی در هایبرنت است و می تونید انجامش بدید که توی مجموعه API های استاندارد JPA و داکیومنت هاش نیست یا محدود تعریف شده

و بالطبع دست شما بازتره توی هایبرنت!

اما از طرف دیگه اگه از API های استاندارد JPA استفاده کنید چون این نوع API ها فقط با interface  ها سروکار داره وهرجایی تو پروژه تون اونها استفاده کنیدپروژه تون رو به این interface ها ( انتزاع ) وابسته می کنید نه پیاده سازی خاص ، در نتیجه پروژه شما در مقابل تغییرات آتی مصون تره یعنی اگه فردا به هر دلیلی بخواهید بجای هایبرنت از پیاده سازی دیگه ی استفاده کنید تغییرات خیلی کمی تو ی کدهاتون نیاز هست بدید
جواب 9 ماه قبل توسط solmaz oskouii_81021 (130 امتیاز)

سوال های مشابه

+1 رأی
3 جواب میانگین بازدید روزانه 0.27578 بازدید
+4 رأی
1 جواب میانگین بازدید روزانه 1.012,587 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.6165 بازدید
سوال 8 ماه قبل در تالار برنامه نویسی توسط masoud shahhosseini_ (40 امتیاز)
0 رأی
1 جواب میانگین بازدید روزانه 0.1221 بازدید
سوال 5 سال قبل در تالار برنامه نویسی توسط kashi (7,128 امتیاز)
0 رأی
1 جواب میانگین بازدید روزانه 0.09215 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.3187 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.4425 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.17307 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.06117 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.1683 بازدید
سوال 1 سال قبل در تالار برنامه نویسی توسط یوری (426 امتیاز)
کانال تلگرام جواب یاب
...