JPA - Asignaciones de Avanzada


Advertisements

JPA es una biblioteca que se lanza con las especificaciones de Java. Por lo tanto, soporta los conceptos orientados a objetos para la persistencia de la entidad. Hasta ahora, hemos terminado con los conceptos básicos de mapeo relacional de objetos. Este capítulo le lleva a través de las asignaciones de avanzada entre objetos y entidades relacionales.

Estrategias de herencia

La herencia es el concepto de la base de cualquier lenguaje orientado a objetos, por lo tanto, podemos utilizar las relaciones de herencia o estrategias entre las entidades. JPA admiten tres tipos de estrategias de herencia: SINGLE_TABLE, JOINED_TABLE y TABLE_PER_CONCRETE_CLASS.

Nos permite considerar un ejemplo. El siguiente diagrama muestra tres clases, es decir personal, TeachingStaff y NonTeachingStaff y sus relaciones.

Estrategia de Herencia

En el diagrama anterior, el personal es una entidad, mientras que TeachingStaff y NonTeachingStaff son las entidades secundarias del personal. Vamos a utilizar el ejemplo anterior para demostrar los tres tres estrategias de la herencia de.

Estrategia de mesa única

Mesa única estrategia toma todos los campos de las clases (clases tanto super y sub) y mapa abajo en una sola tabla conocida como estrategia SINGLE_TABLE. Aquí el valor discriminador desempeña un papel clave en diferenciar los valores de las tres entidades en una tabla.

Nos permite considerar el ejemplo anterior. TeachingStaff y NonTeachingStaff son las subclases de personal. Según el concepto de herencia, una sub clase hereda las propiedades de su super-clase. Por lo tanto sid y sname son los campos que pertenecen a ambos TeachingStaff y NonTeachingStaff. Crear un proyecto JPA. Todos los módulos de este proyecto son los siguientes:

Creación de entidades

Crear un paquete denominado 'com.howcodex.eclipselink.entity' bajo 'src' paquete. Crear una nueva clase de java Staff.java bajo el nombre dado paquete. La clase de entidad personal se muestra como sigue:

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;
   }
}

En el código anterior @DescriminatorColumn specifies the field name (tipo) y sus valores muestran el restante (Teaching and NonTeachingStaff) campos.

Crear una subclase (clase) a la clase de personal nombrado TeachingStaff.java bajo el com.howcodex.eclipselink.entity paquete. La clase de entidad TeachingStaff se muestra como sigue:

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;
   }
}

Crear una subclase (clase) a la clase de personal nombrado NonTeachingStaff.java bajo el com.howcodex.eclipselink.entity paquete. La clase de entidad NonTeachingStaff se muestra como sigue:

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 contiene la información de configuración de base de datos y la información de registro de clases de entidad. El archivo xml se muestra como sigue:

<?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>

Clase de servicio

Clases de servicio son la parte de la implementación del componente empresarial. Crear un paquete bajo ‘src’ paquete denominado ‘com.howcodex.eclipselink.service’.

Crear una clase denominada SaveClient.java bajo el paquete dado para almacenar campos clase personal, TeachingStaff y NonTeachingStaff. La clase SaveClient se muestra como sigue:

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();
   }
}

Después de compilar y ejecutar el programa anterior usted recibirá notificaciones en el panel de la consola de Eclipse IDE. Comprobar MySQL workbench para la salida. La salida en formato tabular se muestra como sigue:

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

Finalmente usted conseguirá una sola tabla que contiene el campo de todas las clases de tres con una columna de discriminador denominada tipo (campo).

Unificadas mesa estrategia

Se unió a mesa estrategia es compartir la columna que se hace referencia que contiene valores únicos para unirse a la mesa y hacer transacciones fáciles. Consideremos el ejemplo de arriba.

Crear un proyecto JPA. Abajo se muestran todos los módulos de proyecto.

Creación de entidades

Crear un paquete denominado ‘com.howcodex.eclipselink.entity’ bajo ‘src’ paquete. Crear una nueva clase de java llamada Staff.java bajo dado paquete. La clase de entidad personal se muestra como sigue:

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;
   }
}

Crear una subclase (clase) a la clase de personal nombrado TeachingStaff.java bajo el com.howcodex.eclipselink.entity paquete. La clase de entidad TeachingStaff se muestra como sigue:

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;
   }
}

Crear una subclase (clase) a la clase de personal nombrado NonTeachingStaff.java bajo el com.howcodex.eclipselink.entity paquete. La clase de entidad NonTeachingStaff se muestra como sigue:

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 archivo contiene la información de configuración de la base de datos y la información de registro de clases de entidad. El archivo xml se muestra como sigue:

<?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>

Clase de servicio

Clases de servicio son la parte de la implementación del componente empresarial. Crear un paquete debajo del paquete 'src' llamado 'com.howcodex.eclipselink.service'.

Crear una clase denominada SaveClient.java bajo el paquete dado para almacenar campos de clase personal, TeachingStaff y NonTeachingStaff. A continuación se muestra la clase SaveClient como sigue:

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();
   }
}

Después de compilar y ejecutar el programa anterior usted recibirá notificaciones en el panel de la consola de Eclipse IDE. Para la salida, verifique MySQL workbench.

Aquí se crean las tres tablas y el resultado de la tabla personal se muestra en un formato tabular.

Sid Dtype Sname
1 TeachingStaff Gopal
2 TeachingStaff Manisha
3 NonTeachingStaff Satish
4 NonTeachingStaff Krishna

El resultado de la tabla TeachingStaff se muestra como sigue:

Sid Qualification Subjectexpertise
1 MSC MED Maths
2 BSC BED English

En la tabla anterior sid es la clave foránea (tabla de referencia campo forma personal) el resultado de NonTeachingStaff mesa se visualiza de la siguiente manera:

Sid Areaexpertise
3 Accounts
4 Office Admin

Finalmente, las tres tablas se crean utilizando sus respectivos campos y el campo de SID es compartido por todas las tres tablas. En el cuadro de personal, SID es la clave principal. En las restantes dos tablas (TeachingStaff y NonTeachingStaff), SID es la clave foránea.

Mesa por estrategia de clase

Tabla por estrategia de clase es crear una tabla para cada entidad sub. Se creará la tabla personal, pero contendrá valores null. Los valores del campo de la tabla del personal deben ser compartidos por las tablas de los TeachingStaff y NonTeachingStaff.

Vamos a considerar el mismo ejemplo que el anterior.

Creación de entidades

Crear un paquete denominado ‘com.howcodex.eclipselink.entity’ bajo ‘src’ paquete. Crear una nueva clase de java llamada Staff.java bajo dado paquete. La clase de entidad personal se muestra como sigue:

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;
   }
}

Crear una subclase (clase) a la clase de personal nombrado TeachingStaff.java bajo el com.howcodex.eclipselink.entity paquete. La clase de entidad TeachingStaff se muestra como sigue:

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;
   }
}

Crear una subclase (clase) a la clase de personal nombra NonTeachingStaff.java bajo el com.howcodex.eclipselink.entity paquete. La clase de entidad NonTeachingStaff se muestra como sigue:

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 archivo contiene la información de configuración de información de bases de datos y el registro de las clases de entidad. El archivo xml se muestra como sigue:

<?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>

Clase de servicio

Clases de servicio son la parte de la implementación del componente empresarial. Crear un paquete bajo ‘src’ paquete denominado ‘com.howcodex.eclipselink.service’.

Crear una clase denominada SaveClient.java bajo el paquete dado para almacenar campos clase personal, TeachingStaff y NonTeachingStaff. La clase SaveClient se muestra como sigue:

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();
   }
}

Después de compilar y ejecutar el programa anterior, usted recibirá notificaciones en el panel de la consola de Eclipse IDE. Para la salida, compruebe MySQL workbench.

Aquí se crean las tres tablas y el Personal tabla contiene registros nulos.

El resultado de TeachingStaff se visualiza de la siguiente manera:

Sid Qualification Sname Subjectexpertise
1 MSC MED Gopal Maths
2 BSC BED Manisha English

La tabla TeachingStaff contiene campos personal y de las entidades TeachingStaff.

El resultado de NonTeachingStaff se visualiza de la siguiente manera:

Sid Areaexpertise Sname
3 Accounts Satish
4 Office Admin Krishna

La tabla NonTeachingStaff contiene campos de los funcionarios y entidades NonTeachingStaff.

Advertisements