مشخصات مقاله
درس هجدهم : آموزش مدل نگاشت Table Per Subclass با استفاده از Annotation
آموزش مدل نگاشت Table Per Subclass با استفاده از Annotation
همان طور که در درس های قبل، اشاره کردیم در استراتژی نگاشت Table Per Subclass، جدول های پایگاه داده به ازای هر کلاس اصلی (Persistent Class) ایجاد شده و از طریق کلیدهای اصلی (Primary key) و کلیدهای خارجی (Foreign key) به هم متصل هستند. بنابراین در این نوع رابطه، ستون های تکراری نخواهیم داشت.
در این مدل نیاز داریم تا annotation های @Inheritance را در کلاس مادر (Parent) و @PrimaryKeyJoinColumn را در کلاس های زیرمجموعه (Subclass) تعریف کنیم.
ابتدا بیایید به سلسله مراتب کلاس هایی که می خواهیم آن ها را آدرس دهی یا map کنیم، نگاهی بیاندازیم :
ساختار هر یک از جدول به شرح زیر خواهد بود.
Table structure for Employee class
Table structure for Regular_Employee class
Table structure for Contract_Employee class
مثال عملی مدل نگاشت Table Per Subclass با استفاده از Annotation
در این مثال عملی، سه جدول اصلی برنامه را ایجاد کرده و سپس آدرس دهی (mapping) لازم برای آن ها را در فایل employee.xml انجام خواهیم داد.
1)ایجاد کلاس های اصلی Persistent Class :
در مرحله اول، بایستی کلاس های اصلی برنامه که وراثت را تولید می کنند، ایجاد کنیم.
کد کلاس Employee.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.javatpoint.mypackage; import javax.persistence.*; @Entity @Table (name = "employee103" ) @Inheritance (strategy=InheritanceType.JOINED) public class Employee { @Id @GeneratedValue (strategy=GenerationType.AUTO) @Column (name = "id" ) private int id; @Column (name = "name" ) private String name; //setters and getters } <button></button> |
کد کلاس Regular_Employee.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.javatpoint.mypackage; import javax.persistence.*; @Entity @Table (name= "regularemployee103" ) @PrimaryKeyJoinColumn (name= "ID" ) public class Regular_Employee extends Employee{ @Column (name= "salary" ) private float salary; @Column (name= "bonus" ) private int bonus; //setters and getters } <button></button> |
کد کلاس Contract_Employee.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.javatpoint.mypackage; import javax.persistence.*; @Entity @Table (name= "contractemployee103" ) @PrimaryKeyJoinColumn (name= "ID" ) public class Contract_Employee extends Employee{ @Column (name= "pay_per_hour" ) private float pay_per_hour; @Column (name= "contract_duration" ) private String contract_duration; //setters and getters } <button></button> |
2)ایجاد فایل تنظیمات و پیکربندی اطلاعات برنامه Congiguratio File :
فایل hibernate.cgf.xml را باز کرده و المنت های زیر را جهت آدرس دهی هر یک از کلاس های برنامه به کد آن اضافه کنید :
1 2 3 4 | < mapping class = "com.javatpoint.mypackage.Employee" ></ mapping > < mapping class = "com.javatpoint.mypackage.Contract_Employee" ></ mapping > < mapping class = "com.javatpoint.mypackage.Regular_Employee" ></ mapping > < button ></ button > |
پس از این تغییر، کد فایل بایستی به صورت زیر شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!--?xml version= '1.0' encoding= 'UTF-8' ?--> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name= "hbm2ddl.auto" >update</property> <property name= "dialect" >org.hibernate.dialect.Oracle 9 Dialect</property> <property name= "connection.url" >jdbc:oracle:thin:@localhost: 1521: xe</property> <property name= "connection.username" >system</property> <property name= "connection.password" >oracle</property> <property name= "connection.driver_class" >oracle.jdbc.driver.OracleDriver</property> <mapping class= "com.javatpoint.mypackage.Employee" ></mapping> <mapping class= "com.javatpoint.mypackage.Contract_Employee" ></mapping> <mapping class= "com.javatpoint.mypackage.Regular_Employee" ></mapping> </session-factory> </hibernate-configuration> <button></button> |

خاصیت hbm2ddl.auto جهت تولید اتوماتیک جدول ها در پایگاه داده، به فایل تنظیمات برنامه اضافه شده است.
3)ایجاد کلاس لازم جهت نگهداری شی Persistant object :
در کلاس StoreData.java که کد آن را مشاهده می کنیم، ساز و کار لازم جهت نگهداری شی Persistant object تعریف شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package com.javatpoint.mypackage; import org.hibernate.*; import org.hibernate.cfg.*; public class StoreData { public static void main(String[] args) { AnnotationConfiguration cfg= new AnnotationConfiguration(); Session session=cfg.configure( "hibernate.cfg.xml" ).buildSessionFactory().openSession(); Transaction t=session.beginTransaction(); Employee e1= new Employee(); e1.setName( "sonoo" ); Regular_Employee e2= new Regular_Employee(); e2.setName( "Vivek Kumar" ); e2.setSalary( 50000 ); e2.setBonus( 5 ); Contract_Employee e3= new Contract_Employee(); e3.setName( "Arjun Kumar" ); e3.setPay_per_hour( 1000 ); e3.setContract_duration( "15 hours" ); session.persist(e1); session.persist(e2); session.persist(e3); t.commit(); session.close(); System.out.println( "success" ); } } <button></button> |