Select com JPA não traz dados após inserí-los (Resolvido)

3 respostas
D

Pessoal blz?

Estou tendo um problema muito sinístro com JPA, e ja fucei em tudo lugar e não achei solução.
seguinte, tenho duas entidades, uma que é a CountryVO e outra TeamVO , essa TeamVO faz um Join com a CountryVO como mostra
o código abaixo

@Entity
@Table(name = "tb_team")
public class TeamVO extends ApplicationVO {

    @JoinColumn(name = "ID_COUNTRY",  referencedColumnName = "ID_COUNTRY" )
    @ManyToOne(optional = false)
    private CountryVO country;
    
    .
    .
    .
    //Demais atributos


}
@Entity
@Table(name = "tb_country")
public class CountryVO extends ApplicationVO {

    @Id
    @Basic(optional = false)
    @Column(name = "ID_COUNTRY")
    private Long idCountry;

    .
    .
    .
    //Demais atributos

}

quando executo o select abaixo

String jpql = "SELECT o FROM TeamVO o JOIN o.country c";

ele traz todos os dados de Team e seu Country referente, mais quando cadastro um novo Team
e executo novamente o select, ele não retorna pro meu novo Team o seu Country relacionado,
ai se eu parar a aplicação e iniciá-la novamente, refazer o deploy, quando executo o meu select ele traz todos os dados certinho

Olhando nos logs eu notei uma coisa estranha, talvez possa ser útil por aqui.
quando é executado o select a primeira vez após eu fazer o deploy da aplicação, sobe no log as seguintes querys

SELECT t0.ID_TEAM, t0.CD_TYPE, t0.DS_IMAGE, t0.DS_TEAM, t0.ID_COUNTRY FROM tb_team t0, tb_country t1 WHERE (t1.ID_COUNTRY = t0.ID_COUNTRY)
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [182]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [184]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [64]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [238]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [15]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [81]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [24]
SELECT ID_COUNTRY, DS_CAPITAL, DS_CURRENCY_CODE, DS_NAME, DS_CURRENCY_NAME, DS_TYPE, DS_PHONE_CODE, DS_SOVEREIGN_STATE, DS_COUNTRY_CODE_2, DS_NAME_FORMAL, DS_COUNTRY_CODE_3, DS_COUNTRY_CODE_NUMBER, DS_SUB_TYPE, DS_COUNTRY_CODE_INTERNET FROM tb_country WHERE (ID_COUNTRY = ?)
        bind => [52]

mais quando executo novamente o select só loga isso

SELECT t0.ID_TEAM, t0.CD_TYPE, t0.DS_IMAGE, t0.DS_TEAM, t0.ID_COUNTRY FROM tb_team t0, tb_country t1 WHERE (t1.ID_COUNTRY = t0.ID_COUNTRY)

pelo que podemos notar, depois que executo pela primeira vez o select, ele não faz mais a busca na tabela tb_country

Alguém ja passou por isso antes e poderia me dar uma força??

3 Respostas

D

alguem?? please…

D

Pessoal fiz mais alguns testes aqui, e vi que com o Hibernate não tem esse tipo de problema, porém não sou fã do mesmo, acho muito ruim
a performance, no momento estou usando TopLink, ja tentei com EclipseLink e acontece a mesma coisa.

Alguem tem alguma sugestão?

D

Pessoal, depois de muito trabalho e consegui resolver o problema.
Lendo por ai na net, descobri que as implementações de JPA possuem um sistema de cache dos dados que são recuperados do banco de dados
que esses dados ficam armazenados no cache por questão de performance e tals… para quem teve ou tiver algum problema parecido com esse, recomendo
que de uma estudada na documentação da implementação usada sobre cache e sobre QueryHint (cache-usage).

Mais enfim, no meu caso eu estou usando EclipseLink como teste mais pretendo usar TopLink, para cada um desses casos existem um propertie que pode
ser configurada no arquivo persistence.xml para desabilitar esse cache, isso pode ser feito tambem para cada query separadamente, por isso recomendo
que deem uma olhada na documentação da implementação JPA usada.

bom, como eu não preciso de cache na aplicação que estou fazendo, configurei no arquivo de persistencia a seguinte propertie que desabilitou o cache:

<property name="eclipselink.cache.shared.default" value="false"/>

bom, espero ter ajudado.

abraço a todos.

Criado 11 de julho de 2009
Ultima resposta 16 de jul. de 2009
Respostas 3
Participantes 1