Tenho uma entidade Arquivo no meu modelo semelhante a esta:
@Entity
@Table(name="arquivo")
public class Arquivo implements Serializable{
@Id
@Column
private Long id;
@Column
private String nomeArquivo;
@Column
private String tipo;
@Column
@Basic(fetch= FetchType.LAZY)
private byte[] conteudo; //conteudo do arquivo (pode ser muito grande)
//getters e setters...
}
ao executar esta query (jpql)
o JPA está me retornando todos os campos, inclusive o Lazy[é o q mostra a query gerada no console da IDE]. Como vou primeiro exibir os arquivo em uma tabela, preciso inicialmente apenas de informações básicas, como nome e tals… é totalmente desnecessário carregar também o conteúdo de todos os arquivos ao carregar a tabela. Caso o usuário selecione algum arquivo, aí sim o conteúdo desse arquivo deve ser carregado (tenho obtido OutOfMemoryError com certa frequencia nessa query, acho q é por causa disso )
como faço para q o JPA busque o campo byte[] conteudo apenas quando for necessário ??
[quote]Note
To enable property level lazy fetching, your classes have to be instrumented: bytecode is added to the original class to enable such feature, please refer to the Hibernate reference documentation. If your classes are not instrumented, property level lazy loading is silently ignored.[/quote]Creio que é o que está acontecendo com você. [=
troque o relacionamento de sua entidade para one-to-many
pois se vc utiliza o nome do arquivo para filtro, pode colocar os arquivos em outra tabela assim e fazer o join na sua entidade
que implicitamente será lazy por padrão.
[quote=rafaduka]troque o relacionamento de sua entidade para one-to-many
pois se vc utiliza o nome do arquivo para filtro, pode colocar os arquivos em outra tabela assim e fazer o join na sua entidade
que implicitamente será lazy por padrão.[/quote]Aaaa ta. Agora que você editou ficou mais claro! =P
A idéia dele é boa, caso você possa implementar.
Ao invés de ter um campo lob você teria uma tabela apenas com essa informação e trocar de um simples campo para um relacionamento.
Necessariamente não precisa ser OneToMany, pode ser OneToOne também. O bom dessa abordagem é que você poderá colocar o Lazy mais facilmente.
O problema dessa abordagem é a tabela que é a mais, e uma entidade a mais. Não sei c aí é assim, mas sei de lugares que só é permitido criar campos nas tabelas com autorização de DBA/Analista e assim vai.