JPA Buscas de parametros diferentes e com Join que retornam o mesmo Objeto
Utilizando a Criteria Query para realizar 2 buscas com Join e apesar de informar parâmetros diferentes nas 2 buscas, eu sempre recebia como retorno em ambas o primeiro objeto buscado. Deixando claro aqui algumas particularidades:
Segue a documentação:
http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/architecture.html#architecture-ejb-persistctxscope
Porém deixo aqui uma duvida a ser testada, não sei qual dos dois metodos é mais impactante,pois ao desatachar do contexto, é cessada a existência desse objeto em um contexto de persistência. E quanto ao segundo método, todo execução do método irá solicitar um nova transação e irá mantar o objeto no contexto de persistência.
Siceramente não sei qual deles tem maior impacto, porem digo que cada uso tem sua utilidade, depende somente da necessidade.
- Por sorte(ou não), o Objeto buscado era o mesmo alguns valores de sua composição mudavam.
- Esses atributos que tinham valores diferentes, não eram utilizados no Equals e HashCode do Objeto buscado.
- A transação do Provider ainda estava aberta quando foi feita a segunda busca.
- Ambas buscas feitas pelo mesmo metodo, porem com parâmetros diferentes
Tendo isso em mente, temos o seguinte cenário a busca é realizada com sucesso, e o provider faz uso do Equals e HashCode para verificar se esse objeto
já existe no contexto de persistência, caso já exista o provider somente retorna o valor que se encontra já gravado no contexto.
No meu caso ambos Objeto retornados eram iguais perante ao Equals e HashCode, por isso era sempre retornado o valor já presente no contexto.
Minha solução pra esse problema, foi remover o objeto do contexto de persistência antes de retorna-lo.
Basta utilizar o código abaixo:
Basta utilizar o código abaixo:
entityManager.detach(obj);//EntityManager da JPAou Adicionar a seguinte anotação no metodo. Pois quando se faz uso do controle de transação JTA, o contexto de persistencia está ligado diretamente a existência da transação, ao solicitar uma nova transação para a execução do metodo, um novo contexto é criado.
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
Segue a documentação:
http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/architecture.html#architecture-ejb-persistctxscope
Porém deixo aqui uma duvida a ser testada, não sei qual dos dois metodos é mais impactante,pois ao desatachar do contexto, é cessada a existência desse objeto em um contexto de persistência. E quanto ao segundo método, todo execução do método irá solicitar um nova transação e irá mantar o objeto no contexto de persistência.
Siceramente não sei qual deles tem maior impacto, porem digo que cada uso tem sua utilidade, depende somente da necessidade.
Comments
Post a Comment