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!

Link para este post

1 comentários:

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