Objeto Temporário
Olá amigos, sou iniciante em Grails e estou tendo o seguinte problema:
Tenho um array do tipo Pessoa, casa Pessoa está associada a (0,n) Carro, sendo assim, a Pessoa pode ter vários carros ou nenhum.
No caso da Pessoa não ter nenhum carro associado eu gostaria de lhe atribuir um Carro com placa diferente dos demais carros, ou seja, um novo Carro com placa '0'.
//busca um carro qualquer do banco
def carroInstance = Carro.findById(1)
carroInstance.placa = 0
for( a in 0..< pessoa.size() ){
//se não tiver um carro atribui o carro com placa '0'
if(!pessoa[a].carro){
pessoa[a].carro.add(carroInstance)
Problema: quando atribuo '0' a placa, o carro de id 1 atualiza o valor de sua placa no banco de dados. Como faço para que o valor da placa fique apenas em memória sem que o Carro de id 1 seja modificado no banco de dados.
isto acontece por causa do comportamento default do Hibernate. Quando obtemos uma instância do banco de dados e alteramos algum atributo, e logo em seguida executamos uma consulta, o Hibernate automaticamente persiste as informações que alteramos no banco de dados.
Por incrível que pareça (eu até hoje fico pasmo com isto), esta foi uma escolha feita "por design". Então, neste caso, o que você poderia fazer seria obter uma sessão do tipo stateless e trabalhar em cima dos seus objetos usando esta seção.
Aqui neste link há um exemplo sobre como obter uma sessão stateless.
Obrigado pela luz Henrique.
Agora estou tentando obter uma SessionFactory para resolver primeiro problema mas está dando esse erro: "caused exception: /hibernate.cfg.xml not found"
ao tentar executar o seguinte código:
StatelessSession sessao = sessionFactory.openStatelessSession();
Transaction tx = sessao.beginTransaction();
ScrollableResults carros = sessao.executeQuery("select * from Carro").scroll(ScrollMode.FORWARD_ONLY);
while ( carros.next() ) {
Carro carro = (Carro) carros.get(0);
carro.placa = 0
sessao.update(carro);
System.out.println(carro.placa)
Você sabe como eu faço para pegar as propriedades da SessionFactory através do Grails?
08/11/2011 17:21
Oi João, precisa disto tudo não.
Você pode injetar o sessionFactory diretamente no seu service tal como no código abaixo
class OperacaoService {
def metodoQuente() {
sessionFactory.qualquer metodo
08/11/2011 17:48
Ok, mas o método .openStatelessSession não pode ser chamado pois a sessionFactory está null.
Como faço para pegar as propriedades da SessionFactory através do Grails ?
estou totalmente perdido.
08/11/2011 19:23
Oi João, aonde você está tentando injetar o sessionFactory?
estou tentando fazer como no código acima, dentro de uma action de um controlador.
Mas me diz uma coisa, com Grails não tem como eu fazer a cópia de um domínio e modificar os atributos dessa cópia sem que haja interferência no objeto copiado? Não existe uma maneira mais simplificada, sem usar stateless Session?
Sugestão: verifique se o objeto sessionFactory está de fato sendo injetado no seu controlador.
No caso, este é o comportamento padrão do próprio Hibernate. É o "hibernate way of life" :)
O que acontece: sempre que você obtém a instância, na realidade você está obtendo o proxy que estará ligado à sessão.
Quando trabalha com o stateless session, você não tem isto, pois não é salvo qualquer estado na sessão, ela é mais "burrinha": apenas obtém o objeto diretamente pra você.