DEV Community

Camila Ferreira
Camila Ferreira

Posted on

Uma breve introdução ao Hibernate

Hibernate é uma ferramenta ORM (Object-Relational Mapping) amplamente utilizada em projetos Java para mapear objetos de uma aplicação para tabelas de um banco de dados relacional.
O ORM é uma ferramenta que facilita o mapeamento entre as classes de um projeto e as entidades de um banco de dados.
Ao usar um framework como o Hibernate o desenvolvedor consegue se concentrar no desenvolvimento do domínio ao invés de se preocupar com os detalhes da persistência.

As principais características do Hibernate são:
1. Transparência no acesso ao dados: O Hibernate permite que os desenvolvedores escrevam código Java que se concentra apenas nos objetos e não nos detalhes de persistência
2. Suporte a transações: Hibernate oferece controle transacional integrado, facilitando a integração com diferentes gerenciadores de transações. Isso garante que as operações de leitura e gravação de dados sejam realizadas de uma forma que a integridade dos dados seja garantida.
3. Controle de herança: Hibernate permite mapear herança entre classes de forma flexível para o banco de dados. Existem diferentes estratégias de mapeamento de herança, como:
Single Table Strategy: Uma única tabela para todas as classes da hierarquia.
Joined Table Strategy: Uma tabela para cada classe concreta.
Table per Class Strategy: Uma tabela para cada classe.
4. Lazy Loading: Hibernate suporta o conceito de lazy loading, onde as coleções e associações de dados são carregadas apenas quando necessário, economizando recursos de memória.
5. Mecanismos de validação: O Hibernate se integra com o Bean Validation, permitindo definir regras de validação para os campos de uma entidade diretamente nas anotações da classe.

O Hibernate é uma das várias implementações da JPA que é uma especificação padrão que define como o ORM deve ser implementado em Java.
Esse framework traz diversos benefícios como a redução de código SQL e JDBC pois o próprio Hibernate gera e executa as consultas automaticamente. Ele também é compatível com uma série de banco de dados relacionais como MySQL, PostgreSQL, MariaDB, etc. O uso de caching e o controle de transações bem definidas ajudam a otimizar a performance da aplicação.
Contudo existem desvantagens no uso de Hibernate como sua curva de aprendizado, embora suas operações mais simples sejam a maioria quando começamos a implementar caching, mapeamento de herança e transações distribuídas podemos enfrentar dificuldades de entendimento num primeiro momento. A abstração oferecida pelo Hibernate também pode adicionar overhead em certas situações, especialmente quando consultas altamente otimizadas são necessárias.

Abaixo podemos ver um exemplo com uma classe Produto e logo abaixo uma explicação sobre algumas das annotations do JPA que são implementadas pelo Hibernate.

`@Entity
@Table(name = "produto")
public class Produto {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private BigInteger id;

@Column(name = "nome_produto", nullable = false)
private String nome;

@Column(name = "descricao_produto")
private String descricao;

@Column(name = "preco_produto", nullable = false)
private BigDecimal preco;

// Getter e Setters
Enter fullscreen mode Exit fullscreen mode

}`

  1. @Entity
    A annotation @Entity indica que a classe Produto é uma entidade JPA. Isso significa que ela será mapeada para uma tabela no banco de dados. Cada instância da classe Produto corresponde a uma linha dessa tabela.
    A classe deve ter um campo com a annotation @id para indicar o identificador único (chave primária) da entidade no banco de dados.

  2. @Table(name = "produto")
    A annotation @Table especifica o nome da tabela no banco de dados à qual essa entidade será mapeada. No exemplo, name = "produto" define que a tabela associada à entidade Produto será chamada "produto". Se a annotation @Table não fosse fornecida, o nome da tabela seria, por padrão, o nome da classe.

  3. @id
    A annotation @id é utilizada para marcar o campo id como a chave primária da entidade. No banco de dados, esse campo será utilizado como o identificador único de cada instância da entidade Produto.

  4. @GeneratedValue(strategy = GenerationType.SEQUENCE)
    A annotation @GeneratedValue indica que o valor do campo id será gerado automaticamente. A propriedade strategy = GenerationType.SEQUENCE especifica que o Hibernate deve usar uma sequência para gerar os valores da chave primária no banco de dados.
    Existem outras estratégias para gerar chaves primárias, como:
    AUTO: Delega a escolha da estratégia ao provedor de persistência (no caso, o Hibernate).
    IDENTITY: Usa uma coluna de identidade do banco de dados, que gera o valor automaticamente durante a inserção.
    TABLE: Usa uma tabela específica para armazenar as chaves primárias.

  5. @Column(name = "nome_produto", nullable = false)
    A annotation @Column mapeia o campo nome da classe para a coluna correspondente no banco de dados. No exemplo, a coluna será chamada "nome_produto".
    O parâmetro nullable = false indica que essa coluna não pode ser nula no banco de dados. Ou seja, é obrigatório que o campo nome tenha um valor.

O Hibernate é uma ferramenta poderosa e flexível para manipulação de dados em aplicações Java, eliminando a necessidade de escrever SQL manualmente. Ele facilita o desenvolvimento de aplicações complexas ao abstrair o mapeamento entre objetos e tabelas do banco de dados e, ao ser compatível com a especificação JPA, oferece uma API padronizada, com a possibilidade de usar funcionalidades avançadas.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay