JPA архив который выпущен с спецификациями Java. Поэтому, оно поддерживает все предмет-ориентированные принципиальные схемы для персистирования реальности. До теперь, мы сделаны с основами отображения предмета реляционного. Эта глава принимает вас через предварительные отображения между предметами и реляционными реальностями.
Унаследование принципиальная схема сердечника любого предмет-ориентированного языка, поэтому мы можем использовать отношения или стратегии унаследования между реальностями. Типы поддержки 3 JPA стратегий унаследования: SINGLE_TABLE, JOINED_TABLE, и TABLE_PER_CONCRETE_CLASS.
Препятствуйте нам рассматривать пример. Следующая диаграмма показывает 3 типа, viz. штат, TeachingStaff, и NonTeachingStaff, и их отношения.
В вышеуказанной диаграмме, штат реальность, пока TeachingStaff и NonTeachingStaff sub-реальности штата. Здесь мы будем использовать вышеуказанный пример для того чтобы продемонстрировать все 3 3 стратегии унаследования.
стратегия Одиночн-таблицы принимает все поля типов (и супер и sub типы) и составляет карту они вниз в одиночную таблицу известную как стратегия SINGLE_TABLE. Здесь значение различителя играет ключевую роль в дифференцировать значения 3 реальностей в одной таблице.
Препятствуйте нам рассматривать вышеуказанный пример. TeachingStaff и NonTeachingStaff sub-типы штата. Согласно принципиальной схеме унаследования, sub-тип наследует свойства своего супер-типа. Поэтому sid и sname поля которые принадлежат как к TeachingStaff, так и к NonTeachingStaff. Создайте проект JPA. Все модули этого проекта следующим образом:
Создайте названный пакет пакетом src "com.howcodex.eclipselink.entity" под'. Создайте новый тип Ява названный Staff.java под, котор дали пакетом. Тип реальности штата показан что следующим образом:
package com.howcodex.eclipselink.entity; import java.io.Serializable; import javax.persistence.DiscriminatorColumn; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table @Inheritance( strategy = InheritanceType.SINGLE_TABLE ) @DiscriminatorColumn( name="type" ) public class Staff implements Serializable { @Id @GeneratedValue( strategy = GenerationType.AUTO ) private int sid; private String sname; public Staff( int sid, String sname ) { super( ); this.sid = sid; this.sname = sname; } public Staff( ) { super( ); } public int getSid( ) { return sid; } public void setSid( int sid ) { this.sid = sid; } public String getSname( ) { return sname; } public void setSname( String sname ) { this.sname = sname; } }
В вышеуказанном @DescriminatorColumn Кода определяет название поля (тип) и свои значения показывают оставая (учить и NonTeachingStaff) поля.
Создайте subclass (тип) для того чтобы укомплектовать штаты TeachingStaff.java названное типом под пакетом com.howcodex.eclipselink.entity. Тип реальности TeachingStaff показан что следующим образом:
package com.howcodex.eclipselink.entity; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity @DiscriminatorValue( value="TS" ) public class TeachingStaff extends Staff { private String qualification; private String subjectexpertise; public TeachingStaff( int sid, String sname, String qualification,String subjectexpertise ) { super( sid, sname ); this.qualification = qualification; this.subjectexpertise = subjectexpertise; } public TeachingStaff( ) { super( ); } public String getQualification( ) { return qualification; } public void setQualification( String qualification ) { this.qualification = qualification; } public String getSubjectexpertise( ) { return subjectexpertise; } public void setSubjectexpertise( String subjectexpertise ) { this.subjectexpertise = subjectexpertise; } }
Создайте subclass (тип) для того чтобы укомплектовать штаты NonTeachingStaff.java названное типом под пакетом com.howcodex.eclipselink.entity. Тип реальности NonTeachingStaff показан что следующим образом:
package com.howcodex.eclipselink.entity; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity @DiscriminatorValue( value = "NS" ) public class NonTeachingStaff extends Staff { private String areaexpertise; public NonTeachingStaff( int sid, String sname, String areaexpertise ) { super( sid, sname ); this.areaexpertise = areaexpertise; } public NonTeachingStaff( ) { super( ); } public String getAreaexpertise( ) { return areaexpertise; } public void setAreaexpertise( String areaexpertise ) { this.areaexpertise = areaexpertise; } }
Persistence.xml содержит информацию конфигурации базы данных и данных по зарегистрирования типов реальности. Архив xml показан что следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL"> <class>com.howcodex.eclipselink.entity.Staff</class> <class>com.howcodex.eclipselink.entity.NonTeachingStaff</class> <class>com.howcodex.eclipselink.entity.TeachingStaff</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpadb"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="root"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
Типы обслуживания часть вставки компонента дела. Создайте пакет под `названным пакетом com.howcodex.eclipselink.service' src `'.
Создайте тип названный SaveClient.java под, котор дали пакетом к поля типу штата, TeachingStaff, и NonTeachingStaff магазина. Тип SaveClient показан что следующим образом:
package com.howcodex.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.howcodex.eclipselink.entity.NonTeachingStaff; import com.howcodex.eclipselink.entity.TeachingStaff; public class SaveClient { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence. createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory. createEntityManager( ); entitymanager.getTransaction( ).begin( ); //Teaching staff entity TeachingStaff ts1=new TeachingStaff( 1,"Gopal","MSc MEd","Maths"); TeachingStaff ts2=new TeachingStaff( 2, "Manisha", "BSc BEd", "English"); //Non-Teaching Staff entity NonTeachingStaff nts1=new NonTeachingStaff( 3, "Satish", "Accounts"); NonTeachingStaff nts2=new NonTeachingStaff( 4, "Krishna", "Office Admin"); //storing all entities entitymanager.persist(ts1); entitymanager.persist(ts2); entitymanager.persist(nts1); entitymanager.persist(nts2); entitymanager.getTransaction().commit(); entitymanager.close(); emfactory.close(); } }
После составлять и исполнять вышеуказанную программу вы получите извещения на панели пульта затмения IDE. Проверите workbench MySQL для выхода. Выход в таблитчатом формате показан что следующим образом:
Sid | Type | Sname | Areaexpertise | Qualification | Subjectexpertise |
---|---|---|---|---|---|
1 | TS | Gopal | MSC MED | Maths | |
2 | TS | Manisha | BSC BED | English | |
3 | NS | Satish | Accounts | ||
4 | NS | Krishna | Office Admin |
Окончательно вы получите одиночную таблицу содержа поле всех 3 типов при названная колонка различителя Типом (полем).
Соединенная стратегия таблицы делить снабженную ссылками колонку которая содержит уникально значения для того чтобы соединить таблицу и сделать легкие трудыы. Препятствуйте нам рассматривать такой же пример как выше.
Создайте проект JPA. Все модули проекта показаны ниже.
Создайте названный пакет пакетом src com.howcodex.eclipselink.entity' под'. Создайте новый тип Ява названный Staff.java под, котор дали пакетом. Тип реальности штата показан что следующим образом:
package com.howcodex.eclipselink.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table @Inheritance( strategy = InheritanceType.JOINED ) public class Staff implements Serializable { @Id @GeneratedValue( strategy = GenerationType.AUTO ) private int sid; private String sname; public Staff( int sid, String sname ) { super( ); this.sid = sid; this.sname = sname; } public Staff( ) { super( ); } public int getSid( ) { return sid; } public void setSid( int sid ) { this.sid = sid; } public String getSname( ) { return sname; } public void setSname( String sname ) { this.sname = sname; } }
Создайте subclass (тип) для того чтобы укомплектовать штаты TeachingStaff.java названное типом под пакетом com.howcodex.eclipselink.entity. Тип реальности TeachingStaff показан что следующим образом:
package com.howcodex.eclipselink.entity; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity @PrimaryKeyJoinColumn(referencedColumnName="sid") public class TeachingStaff extends Staff { private String qualification; private String subjectexpertise; public TeachingStaff( int sid, String sname, String qualification,String subjectexpertise ) { super( sid, sname ); this.qualification = qualification; this.subjectexpertise = subjectexpertise; } public TeachingStaff( ) { super( ); } public String getQualification( ) { return qualification; } public void setQualification( String qualification ) { this.qualification = qualification; } public String getSubjectexpertise( ) { return subjectexpertise; } public void setSubjectexpertise( String subjectexpertise ) { this.subjectexpertise = subjectexpertise; } }
Создайте subclass (тип) для того чтобы укомплектовать штаты NonTeachingStaff.java названное типом под пакетом com.howcodex.eclipselink.entity. Тип реальности NonTeachingStaff показан что следующим образом:
package com.howcodex.eclipselink.entity; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity @PrimaryKeyJoinColumn(referencedColumnName="sid") public class NonTeachingStaff extends Staff { private String areaexpertise; public NonTeachingStaff( int sid, String sname, String areaexpertise ) { super( sid, sname ); this.areaexpertise = areaexpertise; } public NonTeachingStaff( ) { super( ); } public String getAreaexpertise( ) { return areaexpertise; } public void setAreaexpertise( String areaexpertise ) { this.areaexpertise = areaexpertise; } }
Архив Persistence.xml содержит информацию конфигурации базы данных и данных по зарегистрирования типов реальности. Архив xml показан что следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL"> <class>com.howcodex.eclipselink.entity.Staff</class> <class>com.howcodex.eclipselink.entity.NonTeachingStaff</class> <class>com.howcodex.eclipselink.entity.TeachingStaff</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpadb"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="root"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
Типы обслуживания часть вставки компонента дела. Создайте пакет под названным пакетом com.howcodex.eclipselink.service' src.
Создайте тип названный SaveClient.java под, котор дали пакетом к полям магазина типа штата, TeachingStaff, и NonTeachingStaff. После этого тип SaveClient показан что следующим образом:
package com.howcodex.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.howcodex.eclipselink.entity.NonTeachingStaff; import com.howcodex.eclipselink.entity.TeachingStaff; public class SaveClient { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence. createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory. createEntityManager( ); entitymanager.getTransaction( ).begin( ); //Teaching staff entity TeachingStaff ts1=new TeachingStaff( 1,"Gopal","MSc MEd","Maths"); TeachingStaff ts2=new TeachingStaff( 2, "Manisha", "BSc BEd", "English"); //Non-Teaching Staff entity NonTeachingStaff nts1=new NonTeachingStaff( 3, "Satish", "Accounts"); NonTeachingStaff nts2=new NonTeachingStaff( 4, "Krishna", "Office Admin"); //storing all entities entitymanager.persist(ts1); entitymanager.persist(ts2); entitymanager.persist(nts1); entitymanager.persist(nts2); entitymanager.getTransaction().commit(); entitymanager.close(); emfactory.close(); } }
После составлять и исполнять вышеуказанную программу вы получите извещения в панели пульта затмения IDE. Для выхода, проверите workbench MySQL.
Здесь 3 таблицы созданы и результат таблицы штата показан в таблитчатом формате.
Sid | Dtype | Sname |
---|---|---|
1 | TeachingStaff | Gopal |
2 | TeachingStaff | Manisha |
3 | NonTeachingStaff | Satish |
4 | NonTeachingStaff | Krishna |
Результат таблицы TeachingStaff показан следующим образом:
Sid | Qualification | Subjectexpertise |
---|---|---|
1 | MSC MED | Maths |
2 | BSC BED | English |
В вышеуказанной таблице sid чужой ключ (таблица штата формы опорного поля) показан результат таблицы NonTeachingStaff следующим образом:
Sid | Areaexpertise |
---|---|
3 | Accounts |
4 | Office Admin |
Окончательно, 3 таблицы созданы используя их соответственно поля и поле SID поделено всеми 3 таблицами. В таблице штата, SID основной ключ. В оставая 2 таблицах (TeachingStaff и NonTeachingStaff), SID чужой ключ.
Стол за стратегию класса должен составить таблицу для каждого подпредприятия. Таблица Штата будет составлена, но она будет содержать пустые ценности. Полевые данные стола Штата должны быть разделены и столами TeachingStaff и NonTeachingStaff.
Давайте рассмотрим тот же самый пример как выше.
Создайте пакет, названный ‘com.howcodex.eclipselink.entity’ под ‘src’ пакетом. Создайте новый явский класс по имени Staff.java под данным пакетом. Класс предприятия Штата показывают следующим образом:
package com.howcodex.eclipselink.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table @Inheritance( strategy = InheritanceType.TABLE_PER_CLASS ) public class Staff implements Serializable { @Id @GeneratedValue( strategy = GenerationType.AUTO ) private int sid; private String sname; public Staff( int sid, String sname ) { super( ); this.sid = sid; this.sname = sname; } public Staff( ) { super( ); } public int getSid( ) { return sid; } public void setSid( int sid ) { this.sid = sid; } public String getSname( ) { return sname; } public void setSname( String sname ) { this.sname = sname; } }
Создайте подкласс (класс) к классу Штата по имени TeachingStaff.java под com.howcodex.eclipselink.entity пакетом. Класс Предприятия TeachingStaff показывают следующим образом:
package com.howcodex.eclipselink.entity; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity public class TeachingStaff extends Staff { private String qualification; private String subjectexpertise; public TeachingStaff( int sid, String sname, String qualification,String subjectexpertise ) { super( sid, sname ); this.qualification = qualification; this.subjectexpertise = subjectexpertise; } public TeachingStaff( ) { super( ); } public String getQualification( ) { return qualification; } public void setQualification( String qualification ) { this.qualification = qualification; } public String getSubjectexpertise( ) { return subjectexpertise; } public void setSubjectexpertise( String subjectexpertise ) { this.subjectexpertise = subjectexpertise; } }
Создайте подкласс (класс) к классу Штата по имени NonTeachingStaff.java под com.howcodex.eclipselink.entity пакетом. Класс Предприятия NonTeachingStaff показывают следующим образом:
package com.howcodex.eclipselink.entity; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity public class NonTeachingStaff extends Staff { private String areaexpertise; public NonTeachingStaff( int sid, String sname, String areaexpertise ) { super( sid, sname ); this.areaexpertise = areaexpertise; } public NonTeachingStaff( ) { super( ); } public String getAreaexpertise( ) { return areaexpertise; } public void setAreaexpertise( String areaexpertise ) { this.areaexpertise = areaexpertise; } }
Файл Persistence.xml содержит информацию о конфигурации базы данных и информацию о регистрации классов предприятия. xml файл показывают следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL"> <class>com.howcodex.eclipselink.entity.Staff</class> <class>com.howcodex.eclipselink.entity.NonTeachingStaff</class> <class>com.howcodex.eclipselink.entity.TeachingStaff</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpadb"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="root"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
Сервисные классы - часть внедрения бизнес-компонента. Создайте пакет под ‘src’ пакетом, названным ‘com.howcodex.eclipselink.service’.
Создайте класс по имени SaveClient.java под данным пакетом, чтобы сохранить Штат, TeachingStaff и области класса NonTeachingStaff. Класс SaveClient показывают следующим образом:
package com.howcodex.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.howcodex.eclipselink.entity.NonTeachingStaff; import com.howcodex.eclipselink.entity.TeachingStaff; public class SaveClient { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence. createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory. createEntityManager( ); entitymanager.getTransaction( ).begin( ); //Teaching staff entity TeachingStaff ts1=new TeachingStaff( 1,"Gopal","MSc MEd","Maths"); TeachingStaff ts2=new TeachingStaff( 2, "Manisha", "BSc BEd", "English"); //Non-Teaching Staff entity NonTeachingStaff nts1=new NonTeachingStaff( 3, "Satish", "Accounts"); NonTeachingStaff nts2=new NonTeachingStaff( 4, "Krishna", "Office Admin"); //storing all entities entitymanager.persist(ts1); entitymanager.persist(ts2); entitymanager.persist(nts1); entitymanager.persist(nts2); entitymanager.getTransaction().commit(); entitymanager.close(); emfactory.close(); } }
После компилирования и выполнения вышеупомянутая программа, Вы получите уведомления на группе пульта ЯЗЯ Затмения. Для продукции проверьте рабочее место MySQL.
Здесь эти три таблицы составлены, и таблица Штата содержит пустые отчеты.
Результат TeachingStaff показан следующим образом:
Sid | Qualification | Sname | Subjectexpertise |
---|---|---|---|
1 | MSC MED | Gopal | Maths |
2 | BSC BED | Manisha | English |
Вышеупомянутая таблица TeachingStaff содержит области и Предприятий Штата и TeachingStaff.
Результат NonTeachingStaff показан следующим образом:
Sid | Areaexpertise | Sname |
---|---|---|
3 | Accounts | Satish |
4 | Office Admin | Krishna |
Вышеупомянутая таблица NonTeachingStaff содержит области и Предприятий Штата и NonTeachingStaff.