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 oUser ‘s 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.