JDBC significa Java Database Connectivity e fornece um conjunto de API Java para acessar os bancos de dados relacionais do programa Java. Essas APIs Java permitem que programas Java executem instruções SQL e interajam com qualquer banco de dados compatível com SQL.
ORM significa Object-Relacional Mapping (ORM) é uma técnica de programação para converter dados entre bancos de dados relacionais e linguagens de programação orientadas a objetos, como Java, C # etc.
Um sistema ORM tem as seguintes vantagens sobre JDBC simples
Sr. Não. | Vantagens |
---|---|
1 | Permite que o código comercial acesse objetos em vez de tabelas de banco de dados. |
2 | Oculta detalhes de consultas SQL da lógica OO. |
3 | Baseado em JDBC 'sob o capô' |
4 | Não há necessidade de lidar com a implementação do banco de dados. |
5 | Entidades baseadas em conceitos de negócios em vez de estrutura de banco de dados. |
6 | Gerenciamento de transações e geração automática de chaves. |
7 | Desenvolvimento rápido de aplicação. |
Existem várias estruturas persistentes e opções de ORM em Java.
Enterprise JavaBeans Entity Beans
Objetos de Dados Java
Castor
TopLink
Spring DAO
Hibernate
O Hibernate é uma solução Object-Relational Mapping (ORM) para JAVA e foi criada como uma estrutura persistente de código aberto criada por Gavin King em 2001. É um serviço de Consulta e Persistência Object-Relacional de alto desempenho para qualquer aplicativo Java.
O Hibernate mapeia classes Java para tabelas de banco de dados e de tipos de dados Java para tipos de dados SQL e libera o desenvolvedor de 95% das tarefas de programação relacionadas à persistência de dados comuns.
A seguir estão as vantagens de usar o Hibernate.
O Hibernate se encarrega de mapear classes Java para tabelas de banco de dados usando arquivos XML e sem escrever nenhuma linha de código.
Fornece APIs simples para armazenar e recuperar objetos Java diretamente de e para o banco de dados.
Se houver alteração no Banco de Dados ou em qualquer tabela, basta alterar as propriedades do arquivo XML.
Abstraia os tipos de SQL desconhecidos e nos forneça uma solução alternativa para objetos Java familiares.
O Hibernate não requer um servidor de aplicativos para operar.
Manipula associações complexas de objetos de seu banco de dados.
Minimize o acesso ao banco de dados com estratégias de busca inteligente.
Fornece consulta simples de dados.
O Hibernate suporta quase todos os principais RDBMS. A seguir está uma lista de alguns dos motores de banco de dados suportados pelo Hibernate.
HSQL Database Engine
DB2/NT
MySQL
PostgreSQL
FrontBase
Oracle
Banco de dados Microsoft SQL Server
Sybase SQL Server
Servidor Dinâmico Informix
O Hibernate suporta uma variedade de outras tecnologias, incluindo as seguintes -
XDoclet Spring
J2EE
Plug-ins Eclipse
Maven
A seguir estão os principais componentes / objetos do Hibernate -
Configuration - Representa uma configuração ou arquivo de propriedades requerido pelo Hibernate.
SessionFactory - Configura o Hibernate para a aplicação usando o arquivo de configuração fornecido e permite que um objeto Session seja instanciado.
Session - Usado para obter uma conexão física com um banco de dados.
Transaction - Representa uma unidade de trabalho com o banco de dados e a maioria do RDBMS oferece suporte à funcionalidade de transação.
Query - Usa string SQL ou Hibernate Query Language (HQL) para recuperar dados do banco de dados e criar objetos.
Criteria - Usado para criar e executar consultas de critérios orientados a objetos para recuperar objetos.
O objeto de configuração fornece dois componentes principais -
Database Connection- Isso é tratado por um ou mais arquivos de configuração suportados pelo Hibernate. Esses arquivos sãohibernate.properties e hibernate.cfg.xml.
Class Mapping Setup
Este componente cria a conexão entre as classes Java e as tabelas do banco de dados.
O objeto Configuration é o primeiro objeto Hibernate que você cria em qualquer aplicativo Hibernate e normalmente criado apenas uma vez durante a inicialização do aplicativo. Ele representa uma configuração ou arquivo de propriedades requerido pelo Hibernate.
O objeto de configuração é usado para criar um objeto SessionFactory que configura o Hibernate para a aplicação usando o arquivo de configuração fornecido e permite que um objeto Session seja instanciado. A SessionFactory é um objeto thread-safe e usado por todas as threads de um aplicativo.
A SessionFactory é um objeto pesado, então geralmente é criada durante a inicialização do aplicativo e mantida para uso posterior. Você precisaria de um objeto SessionFactory por banco de dados usando um arquivo de configuração separado. Portanto, se você estiver usando vários bancos de dados, terá que criar vários objetos SessionFactory.
Uma sessão é usada para obter uma conexão física com um banco de dados. O objeto Session é leve e projetado para ser instanciado toda vez que uma interação for necessária com o banco de dados. Objetos persistentes são salvos e recuperados por meio de um objeto de Sessão.
Os objetos de sessão não devem ser mantidos abertos por muito tempo porque eles geralmente não são seguros para thread e devem ser criados e destruídos conforme necessário.
Uma transação representa uma unidade de trabalho com o banco de dados e a maior parte do RDBMS suporta a funcionalidade de transação. As transações no Hibernate são tratadas por um gerenciador de transações e transações subjacentes (de JDBC ou JTA).
Este é um objeto opcional e os aplicativos do Hibernate podem escolher não usar esta interface, em vez de gerenciar as transações em seu próprio código de aplicativo.
Os objetos de consulta usam a string SQL ou Hibernate Query Language (HQL) para recuperar dados do banco de dados e criar objetos. Uma instância Query é usada para vincular parâmetros de consulta, limitar o número de resultados retornados pela consulta e, finalmente, executar a consulta.
Objetos de critérios são usados para criar e executar consultas de critérios orientados a objetos para recuperar objetos.
Sr. Não. | Propriedades e descrição |
---|---|
1 | hibernate.dialect Esta propriedade faz com que o Hibernate gere o SQL apropriado para o banco de dados escolhido. |
2 | hibernate.connection.driver_class A classe do driver JDBC. |
3 | hibernate.connection.url O URL JDBC para a instância do banco de dados. |
4 | hibernate.connection.username O nome de usuário do banco de dados. |
5 | hibernate.connection.password A senha do banco de dados. |
6 | hibernate.connection.pool_size Limita o número de conexões aguardando no pool de conexão do banco de dados Hibernate. |
7 | hibernate.connection.autocommit Permite que o modo autocommit seja usado para a conexão JDBC. |
As instâncias podem existir em um dos três estados a seguir em um determinado momento -
transient - Uma nova instância de uma classe persistente que não está associada a uma Sessão e não tem representação no banco de dados e nenhum valor de identificador é considerada transitória pelo Hibernate.
persistent- Você pode tornar uma instância transitória persistente, associando-a a uma Sessão. Uma instância persistente possui uma representação no banco de dados, um valor identificador e está associada a uma Sessão.
detached - Assim que fecharmos a Sessão do Hibernate, a instância persistente se tornará uma instância separada.
O método Session.beginTransaction inicia uma unidade de trabalho e retorna o objeto Transaction associado.
Session.createCriteria cria uma nova instância Criteria, para a classe de entidade fornecida, ou uma superclasse de uma classe de entidade.
Session.createQuery cria uma nova instância de Query para a string de consulta HQL fornecida.
Session.createSQLQuery cria uma nova instância de SQLQuery para a string de consulta SQL fornecida.
Session.delete remove uma instância persistente do armazenamento de dados.
Session.get retorna a instância persistente da entidade nomeada fornecida com o identificador fornecido, ou null se não houver tal instância persistente.
Session.refresh lê o estado da instância dada do banco de dados subjacente.
Session.save salva o estado de determinada instância do banco de dados subjacente.
Session.update atualiza o estado de determinada instância do banco de dados subjacente.
Session.saveOrUpdate salva (Object) ou atualiza (Object) a instância fornecida.
As classes Java cujos objetos ou instâncias serão armazenados nas tabelas do banco de dados são chamadas de classes persistentes no Hibernate.
Existem as seguintes regras principais de classes persistentes, no entanto, nenhuma dessas regras são requisitos rígidos.
Todas as classes Java que serão persistidas precisam de um construtor padrão.
Todas as classes devem conter um ID para permitir fácil identificação de seus objetos dentro do Hibernate e no banco de dados. Esta propriedade mapeia para a coluna de chave primária de uma tabela de banco de dados.
Todos os atributos que serão persistidos devem ser declarados privados e ter getXXX e setXXX métodos definidos no estilo JavaBean.
Um recurso central do Hibernate, proxies, depende da classe persistente ser não final ou da implementação de uma interface que declara todos os métodos públicos.
Todas as classes que não estendem ou implementam algumas classes e interfaces especializadas exigidas pela estrutura EJB.
Um mapeamento de objeto / relacional geralmente é definido em um documento XML. Este arquivo de mapeamento instrui o Hibernate sobre como mapear a classe ou classes definidas para as tabelas do banco de dados. Devemos salvar o documento de mapeamento em um arquivo com o formato <classname> .hbm.xml.
O documento de mapeamento é um documento XML com <hibernate-mapping> como o elemento raiz que contém todos os elementos <class>.
o <class>elementos são usados para definir mapeamentos específicos de classes Java para as tabelas do banco de dados. O nome da classe Java é especificado usando oname atributo do elemento de classe e o nome da tabela do banco de dados é especificado usando o table atributo.
o <id>elemento mapeia o atributo de ID exclusivo na classe para a chave primária da tabela do banco de dados. oname atributo do elemento id refere-se à propriedade na classe e o columnatributo refere-se à coluna na tabela do banco de dados. otype atributo contém o tipo de mapeamento de hibernação, esses tipos de mapeamento serão convertidos do tipo de dados Java para SQL.
o <generator>O elemento dentro do elemento id é usado para gerar automaticamente os valores da chave primária. Colocou oclass atributo do elemento gerador é definido como native para deixar a hibernação pegar também identity, sequence ou hilo algoritmo para criar a chave primária, dependendo dos recursos do banco de dados subjacente.
o <property>elemento é usado para mapear uma propriedade de classe Java para uma coluna na tabela de banco de dados. oname atributo do elemento refere-se à propriedade na classe e o columnatributo refere-se à coluna na tabela do banco de dados. otype atributo contém o tipo de mapeamento de hibernação, esses tipos de mapeamento serão convertidos do tipo de dados Java para SQL.
Isso é mapeado com um elemento <set> e inicializado com java.util.HashSet.
Isso é mapeado com um elemento <set> e inicializado com java.util.TreeSet. O atributo de classificação pode ser definido como um comparador ou ordenação natural.
Isso é mapeado com um elemento <list> e inicializado com java.util.ArrayList.
Isso é mapeado com um elemento <bag> ou <ibag> e inicializado com java.util.ArrayList.
Isso é mapeado com um elemento <map> e inicializado com java.util.HashMap.
Isso é mapeado com um elemento <map> e inicializado com java.util.TreeMap. O atributo de classificação pode ser definido como um comparador ou ordenação natural.
Uma associação muitos para um é o tipo mais comum de associação em que um objeto pode ser associado a vários objetos. Por exemplo, um mesmo objeto de endereço pode ser associado a vários objetos de funcionário.
O elemento <many-to-one> é usado para definir a associação muitos para um. O atributo name é definido para a variável definida na classe pai. O atributo da coluna é usado para definir o nome da coluna na tabela pai.
Uma associação um para um é semelhante à associação muitos para um, com a diferença de que a coluna será definida como exclusiva. Por exemplo, um objeto de endereço pode ser associado a um único objeto de funcionário.
O elemento <many-to-one> é usado para definir a associação um-para-um. O atributo name é definido para a variável definida na classe pai. O atributo coluna é usado para definir o nome da coluna na tabela pai, que é definido como único, de forma que apenas um objeto possa ser associado a outro objeto.
Na associação de mapeamento Um-para-Muitos, um objeto pode ser associado a vários objetos. Por exemplo, o objeto Employee está relacionado a muitos objetos Certificate.
Um mapeamento Um-para-Muitos pode ser implementado usando uma coleção Set java que não contém nenhum elemento duplicado.
O elemento <one-to-many> do elemento set indica que um objeto está relacionado a muitos outros objetos.
Um mapeamento muitos para muitos pode ser implementado usando uma coleção Set java que não contém nenhum elemento duplicado.
O elemento <many-to-many> indica que um objeto está relacionado a muitos outros objetos e os atributos da coluna são usados para vincular a coluna intermediária.
Sim, SessionFactory é um thread-safe e pode ser acessado por vários threads simultaneamente.
Não, a sessão não é thread-safe.
session.save salva o objeto e retorna o id da instância enquanto persist não retorna nada após salvar a instância.
Existem as seguintes diferenças entre os métodos get () e load ().
get () retorna nulo se nenhum dado estiver presente onde como a carga lança a exceção ObjectNotFoundException nesse caso.
get () sempre acessa o banco de dados, enquanto o método load () não atinge o banco de dados.
get () retorna o objeto real, enquanto load () retorna o objeto proxy.
Um recurso central do Hibernate, proxies, depende da classe persistente ser não final ou da implementação de uma interface que declara todos os métodos públicos.
Todas as classes que não estendem ou implementam algumas classes e interfaces especializadas exigidas pela estrutura EJB.
O carregamento lento é uma técnica na qual os objetos são carregados sob demanda. Desde o Hibernate 3, o carregamento lento é por padrão, habilitado para que os objetos filhos não sejam carregados quando o pai é carregado.
HQL significa Hibernate Query Language. Ele usa objetos java da mesma forma que o SQL usa tabelas. HQL é uma linguagem de consulta orientada a objetos e é independente de banco de dados.
O cache de primeiro nível é o cache de sessão e é um cache obrigatório pelo qual todas as solicitações devem passar. O objeto Session mantém um objeto sob seu próprio poder antes de confirmá-lo no banco de dados.
O cache de segundo nível é um cache opcional e o cache de primeiro nível sempre será consultado antes que seja feita qualquer tentativa de localizar um objeto no cache de segundo nível. O cache de segundo nível pode ser configurado em uma base por classe e por coleção e principalmente responsável por objetos de cache em sessões.
O Hibernate também implementa um cache para conjuntos de resultados de consulta que se integra intimamente com o cache de segundo nível.
Este é um recurso opcional e requer duas regiões de cache físico adicionais que contêm os resultados da consulta em cache e os carimbos de data / hora quando uma tabela foi atualizada pela última vez. Isso só é útil para consultas que são executadas frequentemente com os mesmos parâmetros.
Uma estratégia de simultaneidade é um mediador responsável por armazenar itens de dados no cache e recuperá-los do cache. Se você for habilitar um cache de segundo nível, terá que decidir, para cada classe e coleção persistente, qual estratégia de simultaneidade de cache usar.
Transactional - Use esta estratégia para dados em sua maioria de leitura, onde é fundamental evitar dados obsoletos em transações simultâneas, no caso raro de uma atualização.
Read-write - Novamente, use essa estratégia para dados em sua maioria de leitura, onde é essencial evitar dados obsoletos em transações simultâneas, no caso raro de uma atualização.
Nonstrict-read-write- Esta estratégia não garante a consistência entre o cache e o banco de dados. Use essa estratégia se os dados quase nunca mudam e uma pequena probabilidade de dados desatualizados não é uma preocupação crítica.
Read-only- Uma estratégia de simultaneidade adequada para dados que nunca mudam. Use-o apenas para dados de referência.
O que vem a seguir?
Além disso, você pode passar por suas atribuições anteriores que fez com o assunto e certificar-se de que é capaz de falar sobre elas com segurança. Se você está mais descansado, o entrevistador não espera que você responda a perguntas muito complexas; em vez disso, você precisa tornar seus conceitos básicos muito fortes.
Em segundo lugar, realmente não importa muito se você não pudesse responder a algumas perguntas, mas é importante que tudo o que você respondeu, você deve ter respondido com confiança. Portanto, sinta-se confiante durante a entrevista. Nós da tutorialspoint desejamos a você boa sorte em ter um bom entrevistador e tudo de melhor para seu futuro empreendimento. Felicidades :-)