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

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

این جواب ایا درسته که بگیم ما کتابخونه hibernate-entitymanager رو وارد میکنیم که JPA Feature ها رو بشناسه و وارد Hibernate کنه؟

3 پاسخ

+2 امتیاز
قبل توسط (255 امتیاز)
JPA صرفا یک Specification ه. یعنی یسری دستورالعمل ک هیچ  پیاده سازی نداره. شما میتونید از JPA Annotation استفاده کنید که یک کلاس POJO رو بعنوان یک Entity معرفی کنید ولی تا زمانی که پیاده سازی برای JPA وجود نداشته باشد هیچ اتفاقی نمی افتد. Hibernate بعنوان پیاده ساز و یک Wrapper برای JPA عمل می کنه  که کتابخانه بسیار فراگیرتر تر از JPA هم داره. (میتونید از طریق EntityManager همون HibernateSession هم بگیرین، یعنی unwrapp کنین) تلفیقشون هم نمی تونیم بگیم اشتباهه. چون تو بعضی شرایط ممکنه JPA بهتر باشه و بعضی شرایط دیگه مجبور بشین از API هایبرنیت استفاده کنین. Annotation های JPA هم به نوعی مشخص کننده ی خود دستورالعمل کلی هستن که تو Specification اومده.
قبل توسط (426 امتیاز)
جوابتون درسته اما برای سوالی مثل اینکه hibernate و jpa چیه و رابطشون چیه و کی از کدومشون استفاده کنیم داده شده  
اما سوال یکم متفاوت تره
اما تویه جوابتون گفتین  hibernate یک wrapper برای jpa هست رو میشه بیشتر توضیح بدین ممنون میشم
چون معمولا میگم hibernate یک provider یا پیاده ساز از jpa است
قبل توسط (255 امتیاز)
منظورم از wrapper دقیقا همین پیاده سازیه. یعنی شما وقتی از JPA API استفاده می کنین، در واقع اون چیزی که اتفاق می افته اینه که Library و API هایبرنیت فراخوانی میشه. مثل اینه که یه اینترفیس تعریف شده. شما وقتی متد رو فراخوانی می کنی، پیاده سازی متد در کلاس concrete کلاس پیاده ساز اجرا میشه. خب طبیعتا JPA مثل اون اینترفیس عمل میکنه و هایبرنیت نقش کلاس concrete رو اجرا میکنه.
0 امتیاز
قبل توسط (347 امتیاز)
ویرایش شده قبل توسط
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 خاص وابسته می کنید.
0 امتیاز
قبل توسط (130 امتیاز)
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 ها ( انتزاع ) وابسته می کنید نه پیاده سازی خاص ، در نتیجه پروژه شما در مقابل تغییرات آتی مصون تره یعنی اگه فردا به هر دلیلی بخواهید بجای هایبرنت از پیاده سازی دیگه ی استفاده کنید تغییرات خیلی کمی تو ی کدهاتون نیاز هست بدید

سوالات مشابه

+1 امتیاز
3 پاسخ 1.6هزار بازدید
+5 امتیاز
1 پاسخ 4.4هزار بازدید
+1 امتیاز
1 پاسخ 1.1هزار بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
0 امتیاز
1 پاسخ 603 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط kashi (7.2هزار امتیاز)
0 امتیاز
1 پاسخ 458 بازدید
+1 امتیاز
1 پاسخ 562 بازدید
0 امتیاز
2 پاسخ 1.8هزار بازدید
+1 امتیاز
1 پاسخ 389 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
...