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.
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.
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.
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:
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 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>
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).
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.
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 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>
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.
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.
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 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>
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.