JPA - Componentes ORM
A maioria dos aplicativos contemporâneos usa banco de dados relacional para armazenar dados. Recentemente, muitos fornecedores mudaram para o banco de dados de objetos para reduzir sua carga na manutenção de dados. Isso significa que o banco de dados de objetos ou as tecnologias relacionais de objetos estão cuidando do armazenamento, recuperação, atualização e manutenção. A parte central dessas tecnologias relacionais de objeto são o mapeamento do arquivo orm.xml. Como o xml não requer compilação, podemos facilmente fazer alterações em várias fontes de dados com menos administração.
Mapeamento Relacional de Objeto
O Mapeamento Objeto Relacional (ORM) descreve brevemente o que é ORM e como ele funciona. ORM é uma habilidade de programação para converter dados de tipo de objeto para tipo relacional e vice-versa.
A principal característica do ORM é mapear ou vincular um objeto aos seus dados no banco de dados. Durante o mapeamento, temos que considerar os dados, o tipo de dados e suas relações com sua auto-entidade ou entidade em qualquer outra tabela.
Características avançadas
Idiomatic persistence : Permite que você escreva as classes de persistência usando classes orientadas a objetos.
High Performance : Possui muitas técnicas de busca e técnicas de bloqueio esperançosas.
Reliable: É altamente estável e eminente. Usado por muitos programadores industriais.
Arquitetura ORM
Aqui segue a arquitetura ORM.
A arquitetura acima explica como os dados do objeto são armazenados no banco de dados relacional em três fases.
Fase 1
A primeira fase, chamada de Object datafase contém classes POJO, interfaces de serviço e classes. É a principal camada de componente de negócios, que possui operações e atributos de lógica de negócios.
Por exemplo, vamos tomar um banco de dados de funcionários como esquema
A classe POJO do funcionário contém atributos como ID, nome, salário e designação. E métodos como métodos setter e getter desses atributos.
As classes Employee DAO / Service contêm métodos de serviço como criar funcionário, localizar funcionário e excluir funcionário.
Fase 2
A segunda fase denominada como mapping ou persistence fase que contém o provedor JPA, arquivo de mapeamento (ORM.xml), carregador JPA e grade de objetos.
JPA Provider: O produto do fornecedor que contém o tipo JPA (javax.persistence). Por exemplo Eclipselink, Toplink, Hibernate, etc.
Mapping file : O arquivo de mapeamento (ORM.xml) contém a configuração de mapeamento entre os dados em uma classe POJO e os dados em um banco de dados relacional.
JPA Loader: O carregador JPA funciona como a memória cache, que pode carregar os dados da grade relacional. Funciona como uma cópia do banco de dados para interagir com classes de serviço para dados POJO (Atributos da classe POJO).
Object Grid: A grade de objetos é um local temporário que pode armazenar a cópia dos dados relacionais, ou seja, como uma memória cache. Todas as consultas no banco de dados são efetuadas primeiro nos dados da grade de objetos. Somente depois de confirmado, ele afeta o banco de dados principal.
Fase 3
A terceira fase é a fase de dados relacionais. Ele contém os dados relacionais que estão logicamente conectados ao componente de negócios. Conforme discutido acima, apenas quando o componente de negócios confirma os dados, eles são armazenados fisicamente no banco de dados. Até então, os dados modificados são armazenados em uma memória cache como um formato de grade. Mesmo é o processo de obtenção de dados.
O mecanismo de interação programática das três fases acima é chamado de mapeamento relacional de objetos.
Mapping.xml
O arquivo mapping.xml serve para instruir o fornecedor JPA a mapear as classes de Entidade com tabelas de banco de dados.
Tomemos um exemplo de entidade Employee que contém quatro atributos. A classe POJO da entidade Employee chamadaEmployee.java é o seguinte:
public class Employee {
private int eid;
private String ename;
private double salary;
private String deg;
public Employee(int eid, String ename, double salary, String deg) {
super( );
this.eid = eid;
this.ename = ename;
this.salary = salary;
this.deg = deg;
}
public Employee( ) {
super();
}
public int getEid( ) {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getEname( ) {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSalary( ) {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDeg( ) {
return deg;
}
public void setDeg(String deg) {
this.deg = deg;
}
}
O código acima é a classe POJO da entidade Employee. Ele contém quatro atributos eid, ename, salary e deg. Considere que esses atributos são os campos da tabela no banco de dados e eid é a chave primária desta tabela. Agora temos que projetar um arquivo de mapeamento de hibernação para ele. O arquivo de mapeamento chamadomapping.xml é o seguinte:
<? xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<description> XML Mapping file</description>
<entity class="Employee">
<table name="EMPLOYEETABLE"/>
<attributes>
<id name="eid">
<generated-value strategy="TABLE"/>
</id>
<basic name="ename">
<column name="EMP_NAME" length="100"/>
</basic>
<basic name="salary">
</basic>
<basic name="deg">
</basic>
</attributes>
</entity>
</entity-mappings>
O script acima para mapear a classe de entidade com a tabela de banco de dados. Neste arquivo
<entity-mappings> : tag define a definição do esquema para permitir tags de entidade no arquivo xml.
<description> : tag define a descrição sobre o aplicativo.
<entity>: tag define a classe de entidade que você deseja converter em tabela em um banco de dados. A classe de atributo define o nome da classe de entidade POJO.
<table>: tag define o nome da tabela. Se você deseja manter o nome da classe como nome da tabela, esta tag não é necessária.
<attributes> : tag define os atributos (campos em uma tabela).
<id>: tag define a chave primária da tabela. o<generated-value> tag define como atribuir o valor da chave primária, como Automático, Manual ou obtido de Sequência.
<basic> : tag é usada para definir os atributos restantes para a tabela.
<column-name> : tag é usada para definir o nome do campo da tabela definido pelo usuário.
Anotações
Geralmente, os arquivos Xml são usados para configurar componentes específicos ou mapear duas especificações diferentes de componentes. Em nosso caso, temos que manter o xml separadamente em um framework. Isso significa que, ao escrever um arquivo xml de mapeamento, precisamos comparar os atributos da classe POJO com as tags de entidade no arquivo mapping.xml.
Aqui está a solução: Na definição da classe, podemos escrever a parte de configuração usando anotações. As anotações são usadas para classes, propriedades e métodos. As anotações começam com o símbolo '@'. As anotações são declaradas antes da classe, propriedade ou método ser declarado. Todas as anotações de JPA são definidas no pacote javax.persistence.
Aqui segue a lista de anotações usadas em nossos exemplos
Anotação | Descrição |
---|---|
@Entidade | Esta anotação especifica para declarar a classe como entidade ou uma tabela. |
@Mesa | Esta anotação especifica para declarar o nome da tabela. |
@Basic | Esta anotação especifica explicitamente campos sem restrição. |
@Embutido | Esta anotação especifica as propriedades da classe ou uma entidade cuja instância de valor de uma classe incorporável. |
@Eu iria | Esta anotação especifica a propriedade, uso para identidade (chave primária de uma tabela) da classe. |
@GeneratedValue | Essa anotação especifica como o atributo de identidade pode ser inicializado, como Automático, manual ou valor obtido da tabela de sequência. |
@Transient | Esta anotação especifica a propriedade que não é persistente, ou seja, o valor nunca é armazenado no banco de dados. |
@Coluna | Esta anotação é usada para especificar coluna ou atributo para propriedade de persistência. |
@SequenceGenerator | Esta anotação é usada para definir o valor da propriedade que é especificada na anotação @GeneratedValue. Ele cria uma sequência. |
@TableGenerator | Esta anotação é usada para especificar o gerador de valor para a propriedade especificada na anotação @GeneratedValue. Ele cria uma tabela para geração de valor. |
@Tipo de acesso | Este tipo de anotação é usado para definir o tipo de acesso. Se você definir @AccessType (FIELD), ocorrerá o acesso Field wise. Se você definir @AccessType (PROPERTY), ocorrerá uma avaliação inteligente da propriedade. |
@JoinColumn | Esta anotação é usada para especificar uma associação de entidade ou coleção de entidades. Isso é usado em associações muitos-para-um e um-para-muitos. |
@Restrição única | Esta anotação é usada para especificar o campo, restrição única para a tabela primária ou secundária. |
@ColumnResult | Esta anotação faz referência ao nome de uma coluna na consulta SQL usando a cláusula select. |
@Muitos para muitos | Essa anotação é usada para definir um relacionamento muitos para muitos entre as tabelas de junção. |
@ManyToOne | Essa anotação é usada para definir um relacionamento muitos para um entre as tabelas de junção. |
@Um para muitos | Essa anotação é usada para definir um relacionamento um-para-muitos entre as tabelas de junção. |
@Um a um | Essa anotação é usada para definir um relacionamento um para um entre as tabelas de junção. |
@NamedQueries | Esta anotação é usada para especificar uma lista de consultas nomeadas. |
@NamedQuery | Esta anotação é usada para especificar uma Consulta usando um nome estático. |
Java Bean Standard
Classe Java, encapsula os valores de instância e comportamentos em uma única unidade chamada de objeto. Java Bean é um armazenamento temporário e um componente reutilizável ou um objeto. É uma classe serializável que possui um construtor padrão e métodos getter e setter para inicializar os atributos da instância individualmente.
Bean Conventions
Bean contém o construtor padrão ou um arquivo que contém a instância serializada. Portanto, um bean pode instanciar o bean.
As propriedades de um bean podem ser segregadas em propriedades booleanas e propriedades não booleanas.
Propriedade não booleana contém getter e setter métodos.
Propriedade booleana contém setter e is método.
GetterO método de qualquer propriedade deve começar com 'get' em letras minúsculas (convenção de método java) e continuar com um nome de campo que começa com letra maiúscula. Por exemplo, o nome do campo é 'salário', portanto, o método getter desse campo é 'getSalary ()'.
SetterO método de qualquer propriedade deve começar com 'set' em letras minúsculas (convenção do método java), continuando com um nome de campo que começa com letra maiúscula e o valor do argumento para definir como campo. Por exemplo, o nome do campo é 'salário', portanto, o método setter desse campo é 'setSalary (double sal)'.
Para propriedade booleana, é um método para verificar se é verdadeiro ou falso. Por exemplo, a propriedade booleana 'vazia', o método deste campo é 'isEmpty ()'.