sábado, 31 de maio de 2008

JPA x Alterações (externas) na base de dados

Quebrei a cabeça muito tempo por um problema que estava acontecendo em um sistema que utiliza JPA para conexão com o banco de dados, o que ocorria era o seguinte, existem 2 sistemas separados que conectam na mesma base de dados e fazem alterações, o problema era que um não conseguia visualizar as alterações do outro, ou seja, digamos que um dos sistema seja para autorização de vendas e verifique o saldo de determinado cartão e o outro sistema a cada mês retornava o limite de crédito para esse cartão assim ele continuaria comprando normalmente no novo mês, o caso é que o sistema que autoriza as vendas não conseguia vizualiar a alteração de restituição do saldo feita pelo outro sistema, então o cartão embora tivesse saldo, pro sistema de autorização continuava sem... depois eu notei acontecia o mesmo problema se eu alterasse os registros diretamente no banco de dados, os sistemas não conseguiam fazer os selects e trazer os dados atualizados.... eis a solução adotada:

Nas classes das entidades mapeadas, bastou incluir um novo parâmetro nas namedqueries, coloquei em negrito esse novo parâmetro, veja como ficou um pedaço do código por exemplo:

@Entity
@Table(name = "cartoes")
@NamedQueries({@NamedQuery(name = "Cartoes.findByCodigo", query = "SELECT f FROM Cartoes c WHERE c.codigo = :codigo", hints=@QueryHint(name="toplink.refresh", value="true")), @NamedQuery(...})

public class Cartoes implements Serializable {...

Notou o "hints=@QueryHint(name="toplink.refresh", value="true")"? Simples não?

Porém, se você utilizou o createquery na "mão" poderia usar assim, por exemplo:

Query query = this.entityManager.createQuery("SELECT c FROM EmpresasProdutos c WHERE c.empresa.codigo = :empresa AND c.tipo=:produto").setHint("toplink.refresh", "true");

T+