Relacionamento OneToMany pesado ou não ?

Java

15/09/2014

Boa noite galera, eu uso bastante o relacionamento OneToMany, do JPA, e sempre com cautela para não fazer SQL, redundantes no banco de dados.
< br />
Porém quando estava "debugando" reparei que existe o mesmo objeto sendo referenciado várias vezes de maneira redundante.
< br />
Vou colocar um exemplo:

//Classe pai
public class FinPendencia4 implements Serializable {
    //Relacionamento 1
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idfkpendencia6")
    private List<FinPendenciaBaixaItens6> finPendenciaBaixaItens6List;
    //Relacionamento 2
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "finPendencia4")
    private List<FinPendenciaItens11> finPendenciaItens11List;
}
//Classe filha 1
public class FinPendenciaBaixaItens6 implements Serializable {
    @JoinColumn(name = "idfkpendencia6", referencedColumnName = "idcodigo4")
    @ManyToOne(optional = false, cascade = {CascadeType.DETACH, CascadeType.REFRESH})
    private FinPendencia4 idfkpendencia6;
}
//Classe filha 2
public class FinPendenciaItens11 implements Serializable {
    @JoinColumn(name = "idfkpendencia11", referencedColumnName = "idcodigo4")
    @ManyToOne(optional = false, cascade = {CascadeType.DETACH, CascadeType.REFRESH})
    private FinPendencia4 finPendencia4;

}
//Recuperando do banco de dados
FinPendencia4 pendencia = (new pendenciaDao).get(1);
//



Supondo que cada lista de classes filha contenha 5 objetos cada uma respectivamente

Quando recupero do banco de dados um objeto da classe pai "FinPendencia4".

Notei que cada item da lista das classes filhas contem um objeto referenciando a classe pai.

Minha duvida é se esta referencia gasta memória ou pode causar perda de desempenho.


Desde Obrigado pela atenção.
Fernando Silva

Fernando Silva

Curtidas 0

Melhor post

Ronaldo Lanhellas

Ronaldo Lanhellas

16/09/2014

Consome meu caro, pois é necessário gravar o ponteiro para o seu objeto em um endereço de memória X.
GOSTEI 1

Mais Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

15/09/2014

A perca de desempenho depende de como você trata o carregamento do seus objetos e pelo que pude perceber no seu mapeamento todos são Lazy e isso é bom.
Há sim uma perda de desempenho se compararmos a uma aplicação mais procedural que só utiliza SQL e não trabalha com objetos, MAS creio que a perda seja compensada no nível de estruturação e organização que o JPA lhe proprociona. Ainda mais porque Java é interpretada.
GOSTEI 0
Fernando Silva

Fernando Silva

15/09/2014

A perca de desempenho depende de como você trata o carregamento do seus objetos e pelo que pude perceber no seu mapeamento todos são Lazy e isso é bom.
Há sim uma perda de desempenho se compararmos a uma aplicação mais procedural que só utiliza SQL e não trabalha com objetos, MAS creio que a perda seja compensada no nível de estruturação e organização que o JPA lhe proprociona. Ainda mais porque Java é interpretada.


Primeiro obrigado, pela atenção.
Então, o SQL, eu coloquei pra gerar log e o mesmo, esta correto, porem meu medo é o seguinte.
Seguindo o exemplo que dei seria algo similar ao exemplo que vou postar agora, ou seja varias referencias ao mesmo Objeto:
Então pra resumir estas referencias consomem memória?


//Considerando que cada lista tenha 5 objetos o que ocorre é isto.
FinPendencia4 pendencia = (new pendenciaDao).get(1);
FinPendencia4 pendencia1 = pendencia;
FinPendencia4 pendencia2 = pendencia;
FinPendencia4 pendencia3 = pendencia;
FinPendencia4 pendencia4 = pendencia;
FinPendencia4 pendencia5 = pendencia;
FinPendencia4 pendencia6 = pendencia;
FinPendencia4 pendencia7 = pendencia;
FinPendencia4 pendencia8 = pendencia;
FinPendencia4 pendencia9 = pendencia;
FinPendencia4 pendencia10 = pendencia;

GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/09/2014

Bom, acho que sua dúvida seria a seguinte: "Quando eu atribuo o objeto pendencia a um outro objeto pendencia1 eu estou criando mais um objeto (com 5 filhos) em memória ?" Resposta: Não.

Quando você atribui o objeto pendencia ao pendencia1, você está fazendo uma referência apenas ao ponteiro mas continuará com apenas 1 objeto FinPendencia4 em memória, pois os objetos pendencia1,2,3,4,5... apontam para o "pendencia".
GOSTEI 0
Fernando Silva

Fernando Silva

15/09/2014

Bom, acho que sua dúvida seria a seguinte: "Quando eu atribuo o objeto pendencia a um outro objeto pendencia1 eu estou criando mais um objeto (com 5 filhos) em memória ?" Resposta: Não.

Quando você atribui o objeto pendencia ao pendencia1, você está fazendo uma referência apenas ao ponteiro mas continuará com apenas 1 objeto FinPendencia4 em memória, pois os objetos pendencia1,2,3,4,5... apontam para o "pendencia".


Isso mesmo, na verdade sobre o funcionamento da referencia eu já até sabia, e a dúvida é, se estas referencias "ponteiros" consumem memória.
Porque o JPA automaticamente esta criando varias referencias para o mesmo objeto devido ao relacionamento.

Então fiquei com receio de que as referencias estavam consumindo memória.

Fico mais tranquilo em saber que que as referencias não consomem memória.
GOSTEI 0
Fernando Silva

Fernando Silva

15/09/2014

Consome meu caro, pois é necessário gravar o ponteiro para o seu objeto em um endereço de memória X.


Pois é amigo então não vou usar o relacionamento via JPA, vou fazer na mão, porque tenho vários casos de listas grandes.


Sendo assim, matou minha dúvida, Obrigado pela ajuda.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/09/2014

Consome meu caro, pois é necessário gravar o ponteiro para o seu objeto em um endereço de memória X.


Pois é amigo então não vou usar o relacionamento via JPA, vou fazer na mão, porque tenho vários casos de listas grandes.


Sendo assim, matou minha dúvida, Obrigado pela ajuda.


De nada, boa sorte.
GOSTEI 0
POSTAR