27 setembro 2007

Salvando arquivos no BD com JPA

Para aplicativos gigantescos, que armazenarão grande quantidade de arquivos, tenho uma opinião formada: guarde no banco apenas o local em disco do arquivo! Mas, para algumas pessoas, ou para projetos pequenos, a opção de guardar binário no banco parece ser um tanto quanto... interessante. É verdade dizer que facilita o back-up. Basta fazer um dump e pronto.

Para que uma entidade persista um arquivo binário no banco de dados, basta que a coluna seja mapeada com o tipo byte[] e a anotação @Lob, como no exemplo abaixo:

@Entity
public class Attachment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Basic(nullable=false)
private String fileName;

@Lob
private byte[] content;
// getters and setters
}

O problema que encontrei nesta configuração básica, é que o tipo da coluna gerada pelo export do Hibernate, é BLOB. Este tipo está limitado a apenas 64K (65.536 bytes) no MySQL. Para aumentar este limite, foi preciso especificar um tipo DDL (específico por Banco de Dados). Que ficou assim:

@Lob
@Column(columnDefinition="MEDIUMBLOB")
private byte[] content;

Este tipo está limitado a 16 MBytes (16.777.216 bytes), o que no meu caso é mais do que o suficiente :)

[]'s!

2 comentários:

Carlos Coutinho disse...

Olá Bruno!
Já ouviu falar de Content Management? Se o problema não for ($$) esta aí uma outra opção, uma solução muito robusta, que guarda qualquer tipo de arquivo físico.

Exitem vários gerenciadores de documentos. Eu tive experiência com Content Manager e OnDemand (ambos da IBM) é muito bacana

falows

Google Cloud Computing disse...

muito util!

Contato

Email:bruno.borges(at)gmail.com

LinkedIn: www.linkedin.com/in/brunocborges
Twitter: www.twitter.com/brunoborges
Comprei e Não Vou
Rio de Janeiro, RJ Brasil
Oracle
São Paulo, SP Brasil