Tem como habilitar cache para um relacionamento one-to-one com chave estrangeira?
Dá pra botar lazy true nesse tipo de relacionamento?
?
da para habilitar lazy sim! apesar do default de relacao com ponta One ser eager.
sobre o second level cache, tasca um @Cache nessa relacao, ta resolvido.
Olá Paulo,
Quanto ao Lazy, não fuciona, ao menos quando eu uso HQL… com critéria acredito que eu consiga ter um controle maior…
Já a questão do cache… realmente não está funcionando. E já li algumas referências na net (google) que dizem que isso não é possível (mas acho que deveria ser). Tem alguma sugestão? :roll:
Será que eu estou marcando bobeira em alguma coisa…
Grato
Paulo, eu de novo…
Se eu tento colocar um cache pra relação one-to-one eu recebo a seguinte excessão:
... invalid mapping
...
SaxParseException: O conteúdo do tipo de elemento "one-to-one" deve corresponder a "(meta*|formula*)"
O que leva a crer que não é possível usar cache pra esse tipo de relação.
No lazy só são possíveis os valores: false, proxy e no-proxy.
Oi Alex
Nao sei como hbm, mas com anotacoes um simples @OneToOne(fetch=FetchType.LAZY) funciona. Entao deve ter sim como fazer no hbm. Que hibernate voce ta usando? Voce nao ta fazendo “fetch” no HQL neh?
Bem, eu nunca fiz cache de uma relacao que a ponta era One do outro lado, mas nao imagino um motivo pelo qual nao devesse funcionar. Manda os links que voce achou pra gente
Rapaz, se dá pra defirnir ela como “lazy=true” ele vai ser carregado do cache da classe assim que alguém tentar acessar a propriedade pela primeira vez, você não precisa habilitar o cache para o relacionamento.
Provavelmente não deve ser possível fazer cache nesse tipo de relação exatamente por isso, ele vai sempre pegar no cache da classe já que tá fazendo o lazy-load de qualquer jeito.
Mauricio, nao eh bem assim
Cache de relacionamentos funciona como o cache de Queries: ele guarda os IDs. Entao se o livro 7 tem o autor 5 como relacionamento, com cache de relacionamento e lazu esse numero 5 ficaria anotado em algum canto. A dynamic proxy pendurada no getAutor() ja devolve um proxy para levantar o Autor de id 5, sem ter de consultar o banco para ver quem esta relacionado com esse Livro. Pelo menos eh assim para o many. Realmente nao me parece muito util para o One na outra ponta.
O meu problema é o seguinte: eu tenho uma tabela A e uma tabela B que possuem um relacionamento one-to-one de um lado e may-to-one do outro, pois tenho um relacionamento com chave estrangeira.
A questão é que se eu chamo a tabela A (“from A where id = 1”), a tabela B vem junto… eu queria evitar esse comportamento, pois o modelo é complexo, NÃO pode ser mudado e essa característica vai prejudicar o desempenho… eu realmente não preciso da tabela B (lazy=true) na maioria dos casos e em outros casos os dados da tabela B poderiam muito bem estar em cache.
Não posso usar anotações, a solução tem que ser no hbm mesmo.
Paulo, não consegui achar o link que eu tinha lido antes…
Não faz muito sentido você fazer cache de algo que va mudar constantemente, é legal habilitar cache de segundo nível quando você possui uma coleção de objetos que muito raramente ira ser alterada, assim o ganho de performance sera perceptivel.
Estou com um problema de Cache!
Bom, minha aplicação está rodando localmente e em outro servidor, ambos usando do mesmo banco de dados, entretanto, se eu altero um dado local, quando vou receber ele remoto, parece não estar editado, mas se eu fizer um restart do server, ele lê corretamente, portanto, gostaria de saber como desativar o cache do hibernate para algumas classes.
Valew!
Bom, se o problema for com um objeto, você pode fazer assim:
objeto = this.session.refresh(objeto);
[]'s
Daniel
isso?
@SuppressWarnings("unchecked")
public List<Filial> listar() {
this.session.refresh(Filial.class);
return this.session.createCriteria(Filial.class).list();
}
você chegou a configurar cache de 2o nível?
você diz
<property name="cache.use_second_level_cache">rrue</property>
não utilizei nada disso!
então a menos que você esteja segurando a instância da entidade durante várias requisições, e deixando a session/entityManager aberto, não é cache do hibernate.
se você está segurando a instância com a session fechada, basta fazer o session.refresh como o yorgan falou
Dessa maneira?
@SuppressWarnings("unchecked")
public List<Filial> listar() {
this.session.refresh(Filial.class);
return this.session.createCriteria(Filial.class).list();
}
não…
vc chama esse método listar toda hora? ou vc guarda o resultado dele por bastante tempo?
Não chamo toda hora não, mas, o que acontece é… se eu alterar algo, o outro local deve saber se foi modificado ou não, sem precisar de um “refresh”… pois não estaremos acessando apenas de um lugar!