JPA - Предварительные отображения


Advertisements

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

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

Архив 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 чужой ключ.

Table per class strategy

Стол за стратегию класса должен составить таблицу для каждого подпредприятия. Таблица Штата будет составлена, но она будет содержать пустые ценности. Полевые данные стола Штата должны быть разделены и столами 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

Файл 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.

Advertisements