جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی

۱۱ مطلب با کلمه‌ی کلیدی «orm» ثبت شده است

HQL :

زبانی شبیه SQL برای کوئری زدن در هایبرنیت که به جای بکار گرفتن نام جداول و ستون‌ها با entity ها و فیلد ها کار میکند

نمونه : from Cat as cat  برای select زدن روی جدولی که در کلاس Cat تعریف شده است

 

میتوانیم از دو جدول هم کوئری بگیریم که جواب آن بصورت ضرب دکارتی بر میگردد  

from Formula , Parameter

و خروجی را بصورت ArrayList ای از آرایه ها خواهیم داشت و اندیس اول از Formula و اندیس دوم از Parameter خواهد بود و اگر بخواهیم لیست برگشتی فقط لیستی از Formula باشد میتوان HQL را به این صورت نوشت :

select f from Formula f , Parameter 

و اگر بخواهیم بجای List ای از آرایه ها List ای از List ها بگیریم میتوان HQL را به این صورت تغییر داد :

select new List(f) from Formula f , Parameter 

 

از همین روش بالا میتوان ابجکت های model ای داشت که در constractor آرگومان هایی را دریافت کند و در HQL صراحتا مقادیر دریافتی را به آن ارگومان ها پاس بدهیم و خروجی List ای از آن ابجکت دریافت کنیم

**نکته : اصولی نیست که کوئری را برای دو Entity بزنیم و باید تا آنجا که ممکن است دوری کنیم

 

fetch : در کوئری های join زدن ها اگر بخواهیم ستون های جدول دوم را هم دریافت کنیم میتوانیم بعد از کلمه join از fetch استفاده کنیم 

 

**نکته : left join پرفرمانس دیتابیس را تا حد زیادی کم میکنم و راه حل این است که بجای اینکه مقادیر f.key را optional بگیریم حتما برای مقادیر optional از یک مقدار پیش فرض که توسط خودمان تعیین میشود استفاده کنیم که همیشه بتوانیم از inner join استفاده کنیم

 

Named Query :

میتوان در کلاس های Entity کوئری های از پیش تعریف شده ای با یک نام ایجاد کرد و در طول برنامه با استفاده از نام کوئری از آن استفاده کرد

@Entity
@NamedQueries(
     @NamedQuery(name="getUserById" , query="from User where userId = :pUserId")
)
public class User {

private int userId;
private String username;
...
}

با استفاده از Name Query ها کوئری ها از لحاظ ساختاری و اجر چک میشوند و آنها در حافظه cache می شوند

 

Query query = session.createNamedQuery("getUserById")
                    .setParameter("pUserId",1);

List<User> list = query.list();

 

Native Query :

هایبرنیت از کلیه دستورات و امکانات SQL استفاده نمیکند مثل Union و یا میخواهیم بجای HQL از SQL استفاده کنیم ، ما میتوانیم با استفاده از Native Query از آنها استفاده کنیم

 

session.createNativeQuery ("select * from user" , User.class).list();

 

که همانند NamedQueries@ میتوان از NativeQueries@ استفاده کرد و دسته ای از Native Query ها را ایجاد کرد 

 

 

 

 

وضعیت‌های ابجکت های Entity ایجاد شده از Session :

 

- Transient : اگر Entity را ما خودمان ایجاد کرده باشیم و یا بدست آورده باشیم وضعیت آن entity بصورت Transient است که هنوز نه ذخیره شده است و نه مدیریت آن به Session مرتبط است مثلاً زمانی که Entity با عملیات Delete حذف شده است و از Session جدا شده است

 

- Persistent : یا بهش Managed هم میگویند ، در این وضعیت Entity از Session دریافت شده است

 

- Detached : در این وضعیت entity قبلاً از Session دریافت شده است و اکنون که Session بسته (close) شده از Session جدا شده است

 

 

 

**نکته : در طراحی جداول میتوانیم ستون هایی برای نگهداری History یا سابقه رکورد داشته باشیم مثلاً مشخص کنیم کدام عامل این رکورد را ایجاد کرده

 

وقتی روابط One to Many یا Many to Many داریم مجبوریم دیتا ها را در Collection نگهداری کنیم در این بخش نگاهی میکنیم به Collection های مورد استفاده در Hibernate و annotation های کاربردی برای روابط چندگانه و انواع Fetch Type و نحوه تعریف Cascade 



ادامه Annotation های Hibernate  و استراتژی های ساخت Id و استراتژی ساخت نام جدول و ستون ها Strategy Naming 


در این بخش به نحوه ایجاد روابط شی گرایی در دنیای رابطه ای میپردازیم و برخی کانفیگ های ضروری هایبرنیت و استراتژی های تولید Id میپردازیم