مشخصات مقاله
درس چهاردهم : آموزش مدل نگاشت Table Per Hierarchy به وسیله Annotation
آموزش مدل نگاشت Table Per Hierarchy به وسیله Annotation
در درس قبلی، ما به وسیله یک جدول تنها در یک فایل xml، سلسله مراتب وراثت (inheritance hierarchy) را آدرس دهی و نگاشت (mapping) کردیم. در این درس، قصد داریم همین کار را مجددا به وسیله annotation انجام دهیم.
برای این منظور بایستی از موارد زیر در کد annotation خود استفاده کنید :
- Inheritance@
- DiscriminatorColumn@
- DiscriminatorValue@
برای انجام عمل نگاشت Table Per hierarchy، فقط به یک جدول در پایگاه داده نیاز داریم.
همچنین این جدول دارای یک ستون اضافه به نام ستون تفکیک کننده (discriminator Column) می باشد که جهت تشخیص و متمایز کردن کلاس ها از هم به کار می رود.
نقشه سلسله مراتب وراثت در مدل مورد نظر ما به صورت زیر است :
3 کلاس در سلسله مراتب (hierarchy) فوق وجود دارد. کلاس Employee که کلاس مادر و اصلی جهت کلاس های Regular_Employee و Contract_Employee است.
جدول ساختار وراثت کلاس های فوق به صورت زیر است :
مثال عملی نگاشت Table Per Hierarchy به وسیله Annotation :
برای نگاشت مدل Table Per Hierarchy بایستی مراحل زیر را انجام دهید :
- ایجاد کلاس Persistent Class.
- ایجاد فایل تنظیمات و پیکربندی برنامه Configuration file.
- ایجاد کلاس لازم جهت نگهداری و تبادل داده ها.
1)ایجاد کلاس های Persistent Class لازم :
شما بایستی در ابتدا کلاس های اصلی و خام برنامه (Persistent Class) که سلسله مراتب وراثت را مشخص می کند، را ایجاد کنید. برای این منظور 3 کلاس زیر را تعریف می کنیم :
File: Employee.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.javatpoint.mypackage; import javax.persistence.*; @Entity @Table (name = "employee101" ) @Inheritance (strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn (name= "type" ,discriminatorType=DiscriminatorType.STRING) @DiscriminatorValue (value= "employee" ) 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> |
File: Regular_Employee.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.javatpoint.mypackage; import javax.persistence.*; @Entity @Table(name = "employee101" ) @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name= "type" ,discriminatorType=DiscriminatorType.STRING) @DiscriminatorValue(value= "employee" ) 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> |
File: Contract_Employee.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.javatpoint.mypackage; import javax.persistence.*; @Entity @Table(name = "employee101" ) @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name= "type" ,discriminatorType=DiscriminatorType.STRING) @DiscriminatorValue(value= "employee" ) 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> |
2)اضافه کردن Persistent Class در فایل تنظیمات برنامه :
فایل hibernate.cgf.xml را باز کرده و المنت های (mapping) زیر را بر هر یک از کلاس برنامه اضافه کنید. کد فایل تنظیمات به صورت زیر بایستی تبدیل شود :
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> |
: اکنون فایل تنظیمات به صورت زیر خواهد شد
File: hibernate.cfg.xml
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.Oracle9Dialect</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 class = "com.javatpoint.mypackage.Contract_Employee" > <mapping class = "com.javatpoint.mypackage.Regular_Employee" > </mapping></mapping></mapping></session-factory> </hibernate-configuration> <button></button> |

خاصیت hbm2ddl.auto برای تولید اتوماتیک جدول پایگاه داده تعیین شده است.
3)ایجاد کلاس لازم جهت نگهداری شی Persistent Class Object :
به وسیله کلاس StoreTest.java که کد آن در قسمت زیر مشخص شده است، می توانید شی employee را در پایگاه داده نگهداری کنید :
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 35 | 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> |
4)خروجی برنامه به صورت زیر خواهد بود :