Relacionamento OneToMany pesado ou não ?
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:
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.
< 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
Curtidas 0
Melhor post
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
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.
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
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.
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
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".
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
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".
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
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
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