JPA - Mapeamentos Avançados


Advertisements

JPA é uma biblioteca que é lançada com as especificações Java. Por isso, ele suporta todos os conceitos de orientação a objetos para entidade persistência. Até agora, são feitas com as noções básicas do mapeamento objeto-relacional. Este capítulo leva você através dos mapeamentos avançados relacional entre objetos e entidades.

Herança Estratégias

Herança é o conceito central em qualquer linguagem orientada a objetos, por isso podemos utilizar relacionamentos de herança ou de estratégias entre as entidades. JPA suporta três tipos de herança estratégias: SINGLE_TABLE, JOINED_TABLE e TABLE_PER_CONCRETE_CLASS.

Vamos considerar um exemplo. O diagrama a seguir mostra três classes, ou seja pessoal, TeachingStaff e NonTeachingStaff, e seus relacionamentos.

Estratégia Inheritance

No diagrama acima, o pessoal é uma entidade, embora TeachingStaff e NonTeachingStaff são os sub-entidades de funcionários. Aqui, vamos usar o exemplo acima para demonstrar todos os três três estratégias de herança.

Tabela única estratégia

Single-table estratégia tem todas as categorias domínios (ambos super e sub classes) e mapeá-los para baixo em um único quadro conhecido como SINGLE_TABLE estratégia. Aqui, o discriminador desempenha um papel-chave na diferenciação entre os valores das três entidades em uma tabela.

Vamos considerar o exemplo acima. TeachingStaff e NonTeachingStaff são as sub-classes de funcionários. De acordo com o conceito de herança, uma sub-classe herda as propriedades da sua super-classe. Assim, sid e sname são os campos que pertencem a ambos TeachingStaff e NonTeachingStaff. Criar uma JPA projeto. Todos os módulos do presente projecto são os seguintes:

Criar Entidades

Criar um pacote chamado ‘com.howcodex.eclipselink.entity’ em 'src'pacote. Crie uma nova classe java chamada pessoal.java sob determinado pacote. A entidade equipe classe é mostrado como se segue:

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

No código acima @DescriminatorColumn especifica o nome do campo (tipo) e seus valores mostrar os restantes (ensino e NonTeachingStaff) os campos.

Criar uma subclasse (classe) a equipe classe chamada TeachingStaff.java sob o com.howcodex.eclipselink.entity pacote. A entidade TeachingStaff classe é mostrado como se segue:

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

Criar uma subclasse (classe) a equipe classe chamada NonTeachingStaff.java sob o com.howcodex.eclipselink.entity pacote. A entidade NonTeachingStaff classe é mostrado como se segue:

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

Persistência.xml

Persistência.xml contém as informações de configuração de banco de dados e as informações de registro de classes de entidades. O arquivo xml é mostrado como se segue:

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

Classe de Serviço

As classes de serviço são a execução parte da componente comercial. Criar um pacote em 'src' pacote chamado ‘com.howcodex.eclipselink.service’

Criar uma classe chamada SaveClient.java sob um determinado pacote a equipe da loja, TeachingStaff e NonTeachingStaff campos de classe. O SaveClient classe é mostrado como se segue:

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

Após compilar e executar o programa você irá receber notificações sobre o painel do console do Eclipse IDE. Verifique se o MySQL workbench para a saída. A saída em um formato de tabela é mostrado como se segue:

Sid Tipo Sname Areaexpertise Qualificação Subjectexpertise
1 TS Gopal MSC MED Matemática
2 TS Manisha BSC BED Inglês
3 NS Satish Contas
4 NS Krishna Office Admin

Finalmente, você irá obter uma única tabela que contém o campo de todas as três classes com uma coluna de nome Tipo discriminador (domínio).

Juntou-se à estratégia da tabela

Juntou-se à estratégia da tabela é para partilhar a referida coluna que contém valores únicos para se juntar à mesa e facilitar as operações. Vamos considerar o mesmo exemplo acima.

Criar uma JPA Projeto. Todos os módulos do projeto são mostrados abaixo.

Criar Entidades

Criar um pacote chamado ‘com.howcodex.eclipselink.entity’ em 'src' pacote. Crie uma nova classe java chamada pessoal.java sob determinado pacote. A entidade equipe classe é mostrado como se segue:

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

Criar uma subclasse (classe) a equipe classe chamada TeachingStaff.java sob o com.howcodex.eclipselink.entity pacote. A entidade TeachingStaff classe é mostrado como se segue:

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

Criar uma subclasse (classe) a equipe classe chamada NonTeachingStaff.java sob o com.howcodex.eclipselink.entity pacote. A entidade NonTeachingStaff classe é mostrado como se segue:

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

Persistência.xml

Arquivo persistence.xml contém as informações de configuração do banco de dados e as informações de registro de classes de entidades. O arquivo xml é mostrado como se segue:

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

Classe de Serviço

As classes de serviço são a execução parte da componente comercial. Criar um pacote em 'src' pacote chamado ‘com.howcodex.eclipselink.service’.

Criar uma classe chamada SaveClient.java sob o pacote para os campos de armazenamento do pessoal, TeachingStaff e NonTeachingStaff classe. Em seguida, SaveClient classe é mostrado como se segue:

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

Após compilar e executar o programa você irá receber notificações no painel do console do Eclipse IDE. Para a saída, verifique se o MySQL workbench.

Aqui três tabelas são criadas e o resultado do quadro de pessoal é exibida em um formato tabular.

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

O resultado da TeachingStaff tabela é apresentada como segue:

Sid Qualificação Subjectexpertise
1 MSC MED Matemática
2 BSC BED Inglês

No quadro acima sid é chave estrangeira (campo de referência formar quadro de pessoal) o resultado da NonTeachingStaff tabela é exibida como se segue:

Sid Areaexpertise
3 Contas
4 Office Admin

Por fim, as três tabelas são criadas usando seus respectivos campos e o SID field é partilhada por todos os três tabelas. No quadro de pessoal, SID é a chave primária. Nas restantes duas tabelas (TeachingStaff e NonTeachingStaff), SID é chave estrangeira.

Estratégia Tabela por classe

Tabela por classe estratégia é criar uma tabela para cada sub-entidade. O quadro de pessoal será criado, mas ele irá conter valores nulos. Os valores de campo de quadro de pessoal deve ser compartilhado por ambos os NonTeachingStaff TeachingStaff e tabelas.

Vamos considerar o mesmo exemplo acima.

Criar Entidades

Criar um pacote chamado ‘com.howcodex.eclipselink.entity’ em 'src' pacote. Crie uma nova classe java chamada pessoal.java sob determinado pacote. A entidade equipe classe é mostrado como se segue:

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

Criar uma subclasse (classe) a equipe classe chamada TeachingStaff.java sob o com.howcodex.eclipselink.entity pacote. A entidade TeachingStaff classe é mostrado como se segue:

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

Criar uma subclasse (classe) a equipe classe chamada NonTeachingStaff.java sob ocom.howcodex.eclipselink.entitypacote. A entidade NonTeachingStaff classe é mostrado como se segue:

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

Persistência.xml

Arquivo persistence.xml contém as informações de configuração de banco de dados e informações de registro de classes de entidades. O arquivo xml é mostrado como se segue:

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

Classe de Serviço

As classes de serviço são a execução parte da componente comercial. Criar um pacote em 'src' pacote chamado ‘com.howcodex.eclipselink.service’.

Criar uma classe chamada SaveClient.java sob um determinado pacote a equipe da loja, TeachingStaff e NonTeachingStaff campos de classe. O SaveClient classe é mostrado como se segue:

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

Após compilar e executar o programa, você irá receber notificações sobre o painel do console do Eclipse IDE. Para a saída, verifique se o MySQL workbench.

Aqui as três tabelas são criadas e o quadro de pessoal contém null records.

O resultado da TeachingStaff é apresentado como segue:

Sid Qualificação Sname Subjectexpertise
1 MSC MED Gopal Matemática
2 BSC BED Manisha Inglês

A tabela acima contém campos de TeachingStaff tanto TeachingStaff pessoal e entidades.

O resultado da NonTeachingStaff é apresentado como segue:

Sid Areaexpertise Sname
3 Contas Satish
4 Office Admin Krishna

A tabela acima contém campos de NonTeachingStaff tanto NonTeachingStaff pessoal e entidades.

Advertisements