Embedded Object در Hibernate جاوا
از سری مقالات آموزش Java Enterprise, مبحث Embedded Object در Hibernate را برمیگزینیم.
در مقالات قبل مبانی ذخیره سازی اطلاعات در Hibernate را مورد بررسی قرار دادیم. همینطور با استفاده از Annotation ها, دقت عمل Mapping توسط Hibernate را افزایش دادیم. اما در این مقاله قصد داریم تا به مفهوم دیگری بپردازیم. واضح است که در برنامه هایی که مینویسیم, متغیر های کلاس Persistent حتما متغیر هایی از نوع integer, string, float و مانند اینها نیستند. گاهی یک لیست از یک نوع متغیر داریم. همچنین ممکن است متغیر ما از نوع یک کلاس دیگر باشد که آن کلاس نیز توسط برنامه نویس نوشته شده است. در واقع این مقاله میخواهیم به مفهوم Embedded Object بپردازیم.
فرض کنید کلاس User را که تا به حال در مثال ها استفاده میکردیم, بخواهیم تغییری در ساختار متغیر location آن بوجود آوریم. در مثال های قبل, location از نوع string تعریف شده است. اما در این مقاله ساختار location را به اینگونه تغییر میدهیم:
public class Location { private String city; private String country; private double latitude; private double longitude; }
توجه داشته باشید که در اینجا برای کوتاه تر شدن کد ها, از نوشتن متد های getter و setter صرف نظر کردهایم. کلاس User را به این صورت تغییر میدهیم:
public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; private Location location; }
یکی از روش هایی که برای ذخیره سازی این اطلاعات به ذهن میرسد, این است که متغیر های کلاس location را به عنوان column در User Table تعریف کنیم.
در اینجا Value Object ها مفهوم پیدا میکنند. Value Object که نوعی از ٍEmbedded Object ها هستند, به Object هایی اطلاق میشود که به یک object دیگر معنا و مفهوم میبخشد و به تنهایی فاقد ارزش است. در مثال فوق, location به تنهایی مفهوم ندارد. location, نشانی کاربر را مشخص میکند. اما آیا نشانی به تنهایی اهمیت دارد؟ وقتی از نشانی صحبت میکنیم, مهم است که این نشانی متعلق به شخص است. نشانی, در اینجا به عنوان یکی از اطلاعات کاربر است که معنا پیدا کرده است. همچنین میتوان به شماره تلفن شخص اشاره کرد. شماره تلفن اگر به عنوان یکی از مشخصات فرد باشد, یک داده با اهمیت است و به تنهایی ارزشی ندارد. در واقع بدون وجود user object, متغیر phone نیز بی اهمیت میشود.
در اینجا باید میان Entity و Value Object تفاوت قائل شویم. Entity به تنهایی دارای معنا است اما Value Object باید بخشی از یک موجودیت باشد تا معنا پیدا کند. برای مثال location یک Value Object برای User Entity است. الزاماٌ تمام متغیر های Entity نباید از نوع Value Object باشند. گاهی ممکن است یک Entity به عنوان متغیر, در Entity دیگری باشد.
به این ترتیب روش اول, میتواند برای Value Object ها قابل استفاده باشد. اکنون Embeddable Annotation را به کلاس location اضافه میکنیم:
@Embeddable public class Location { private String city; private String country; private double latitude; private double longitude; }
و در کلاس user نیز location را به عنوان embedded تعریف میکنیم:
@Embedded private Location location;
اکنون اگر این object را در پایگاه داده ذخیره کنیم, چهار column به جدول اضافه شده است. اما اگر دو متغیر از یک نوع value object داشته باشیم, نیاز است تا تفاوت آنها را مشخص کنیم. فرض کنید این کاربران ما دو نشانی دارند. نشانی اول, نشانه محل کار آنها و نشانی دوم, نشانی محل زندگی آنها است:
@Embedded private Location homeLocation; @Embedded private Location workLocation;
در اینجا برای ذخیره سازی اطلاعات با خطا زیر مواجه میشویم:
Repeated column in mapping for entity: Models.User column: city
این خطا به این معنا است که column های تکراری برای ذخیره سازی در پایگاه داده داریم. برای رفع این مشکل از attribute override annotation استفاده میشود.
@AttributeOverride(name = "city", column = @Column(name = "home_city"))
کد بالا, city را به عنوان home_city در پایگاه داده قرار میدهد. برای هریک از column ها به یک attribute override نیاز داریم و تمام این attribute override ها در یک attribute overrides annotation قرار میگیرند:
@Embedded @AttributeOverrides({ @AttributeOverride(name = "city", column = @Column(name = "home_city")), @AttributeOverride(name = "country", column = @Column(name = "home_county")), @AttributeOverride(name = "latitude", column = @Column(name = "home_latitute")), @AttributeOverride(name = "longitude", column = @Column(name = "home_longitude"))} ) private Location homeLocation;
همانطور که مشاهده میکنید, این annotation ها تنها به یک متغیر اخصاص یافته اند.
در این مقاله سعی بر این شد تا مفهوم Embedded Object و Value Object را بررسی کنیم و به شیوه ذخیره سازی آنها بپردازیم. در مقاله بعد, به مبحث Collection ها در Hibernate میپردازیم.
سری مقالات آموزش Java Enterprise ادامه دارد.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.