[Resolvido] Dúvida com JPQL: fetch Lazy para qualquer propriedade
12 respostas
Rafael_Nascimento
Tenho uma entidade Arquivo no meu modelo semelhante a esta:
@Entity@Table(name="arquivo")publicclassArquivoimplementsSerializable{@Id@ColumnprivateLongid;@ColumnprivateStringnomeArquivo;@ColumnprivateStringtipo;@Column@Basic(fetch=FetchType.LAZY)privatebyte[]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 ??
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.
O Ant é usado para gerar o WAR/EAR (e outras coisas). Você teria um trabalho bom para criar esse arquivo.
Agora, se tu vai querer encarar o Ant mesmo, procure no google ant create EAR
É uma linguagem simples. [=
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.
Hebert_Coelho
rafaduka:
troque o relacionamento de sua entidade para one-to-many
Hein!?
Fazer um OneToMany com um blob? Sério mesmo? Nunca vi isso…
Rafael_Nascimento
puts, mas q saco
estou usando o NetBeans 7.2, sem o maven
vou ver o q da pra fazer…
obrigado pelas dicas, Hebert
Hebert_Coelho
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.
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.
Rafael_Nascimento
essa proposta do rafaduka, parece interessante e mais simples de implementar