Mapeando dados LOB no Hibernate

Mapeando dados LOB no Hibernate

1. Visão geral

LOB ou Large OBject refere-se a um tipo de dados de comprimento variável para armazenar objetos grandes.

O tipo de dados tem duas variantes:

  • CLOB -Character Large Object armazenará grandes dados de texto

  • BLOB -Binary Large Object é para armazenar dados binários como imagem, áudio ou vídeo

Neste tutorial, mostraremos como podemos utilizar o Hibernate ORM para persistir objetos grandes.

2. Configuração

Por exemplo, usaremos Hibernate 5 e H2 Database. Portanto, devemos declará-los como dependências em nossopom.xml:


    org.hibernate
    hibernate-core
    5.2.12.Final


    com.h2database
    h2
    1.4.196

A versão mais recente das dependências está emMaven Central Repositories.

Para uma análise mais aprofundada da configuração do Hibernate, consulte um de nossos artigosintroductory.

3. Modelo de Dados LOB

Nosso modelo“User” tem id, nome e foto como propriedades. Armazenaremos uma imagem na propriedade de foto deUser e a mapearemos para um BLOB:

@Entity
@Table(name="user")
public class User {

    @Id
    private String id;

    @Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

    @Lob
    @Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;

    // ...
}

A anotação@Lob especifica que o banco de dados deve armazenar a propriedade comoLarge Object. OcolumnDefinition na anotação@Column define o tipo de coluna para a propriedade.

Como vamos economizarbyte array, estamos usandoBLOB.

4. Uso

4.1. Iniciar sessão de hibernação

session = HibernateSessionUtil
  .getSessionFactory("hibernate.properties")
  .openSession();

Usando a classe auxiliar, construiremosHibernate Session usando as informações do banco de dados fornecidas no arquivohibernate.properties.

4.2. Criando instância do usuário

Vamos supor que o usuário carregue a foto como um arquivo de imagem:

User user = new User();

InputStream inputStream = this.getClass()
  .getClassLoader()
  .getResourceAsStream("profile.png");

if(inputStream == null) {
    fail("Unable to get resources");
}
user.setId("1");
user.setName("User");
user.setPhoto(IOUtils.toByteArray(inputStream));

Convertemos o arquivo de imagem no array de bytes usando a ajuda da bibliotecaApache Commons IO e, finalmente, atribuímos o array de bytes como parte do objetoUser recém-criado.

4.3. Objeto grande persistente

Ao armazenarUser usandoSession, oHibernate converterá o objeto no registro do banco de dados:

session.persist(user);

Por causa da anotação@Lob declarada na classeUser,Hibernate entende que deve armazenar a propriedade“photo” como tipo de dadosBLOB.

4.4. Data de validade

Vamos recuperar os dados de volta do banco de dados e usarHibernate para mapeá-los de volta ao objetoJava para compará-los com os dados inseridos.

Como sabemos oUsers id inserido, vamos usá-lo para recuperar os dados do banco de dados:

User result = session.find(User.class, "1");

Vamos comparar o resultado da consulta com os dados de entradaUser:

assertNotNull(
  "Query result is null",
  result);

assertEquals(
  "User's name is invalid",
  user.getName(), result.getName() );

assertTrue(
  "User's photo is corrupted",
  Arrays.equals(user.getPhoto(), result.getPhoto()) );

Hibernate mapeará os dados no banco de dados para o objetoJava usando as mesmas informações de mapeamento nas anotações.

Portanto, o objetoUser recuperado terá as mesmas informações dos dados inseridos.

5. Conclusão

LOB é o tipo de dados para armazenar dados de objetos grandes. Existem duas variedades deLOB, chamadasBLOBeCLOB. BLOB é para armazenar dados binários, enquantoCLOB é para armazenar dados de texto.

UsandoHibernate, demonstramos como é muito fácil mapear os dados de e para objetosJava, contanto que estejamos definindo o modelo de dados correto e a estrutura de tabela apropriada no banco de dados.

Como sempre, o código deste artigo está disponívelover on GitHub.