[RESOLVIDO]OneToMany é necessário mapear?

10 respostas
A

pessoal. estou desenvolvendo minha aplicação com hibernate com jpa. quando tenho uma chave estrangeira na tabela crio um manytoone nela, agora pergunto. eu não estou criando os onetomany apenas os manytoone esta correto ou se eu criei o manytoone eu tenho que criar o onetomany do outro lado.

obs. evito de usar pois duplica as listas minhas. exemplo: se eu deixar um onetomany na classe de relatorios (pois para cada relatorio existem varios parametros) entao duplicara os relatorios. exemplo. relatorio1 parametro1, relatorio1 parametro2 etc…

gostaria da opinião de vcs

10 Respostas

R

Usar @OneToMany vai depender da necessidade da sua aplicação.

Quando se usa em conjunto o @OneToMany e @ManyToOne voce tem um relacionamento bidirecional e no seu caso como esta usando somente o @ManyToOne voce tem um relacionamento unidirecional.

T

Você deve “mapear do outro lado” apenas caso queira uma relação bidirecional.
Recomendo uma leitura sobre JPA, mais especificamente sobre os tipos de relação.

G

Se você estiver falando sobre a criação de uma tabela “de-para” duplicando desnecessariamente o mapeamento, eu tive o mesmo problema e ele foi resolvido neste tópico:
http://www.guj.com.br/posts/list/132414.java

A

vlw pessoal pelas respostas se houver mais esta aberto :smiley:

A

Se você estiver falando sobre a criação de uma tabela “de-para” duplicando desnecessariamente o mapeamento, eu tive o mesmo problema e ele foi resolvido neste tópico:
http://www.guj.com.br/posts/list/132414.java

eu sempre uso mapedby não é isso não. vlw

T

Cara, posta ai seu “select” (usando criteria?).
Tenta fazer por Distincty, dessa maneira:

criteria.setResultTransformer(criteria.DISTINCT_ROOT_ENTITY);

Boa sorte!

A

é eu ja tinha visto sobre o rootdistinct mas eu achava que o hibernate poderia não levar em consideração a lista automaticamente :roll:

T

Mas e ai, funcionou ou não?

L

Evite, sempre que possivel, o relacionamento bi-direcional... se não houver necessidade real de mapear, não o faça... a dezenas de problemas implicitos que podem aperecer em mapear um @OneToMany ...

Para mim, o ideal é não mapear, e sempre que precisar saber os elementos desta relação fazer uma consulta simples, ou seja... no lugar de mapear @OneToMany crie uma @NamedQuery para tal função, ai você evita o problema...

a @NamedQuery deve ser colocado no lado @ManyToOne para ficar mais facil de entender

Por exemplo, o relacionamento de estados e pais pode ser mapeado assim

import javax.persistence.*;

@Entity
@NamedQueries({
	//...outras NamedQuerys...
	/**
	 * Busca todos os <tt>{@link Estado}s</tt> do {@link Pais} enviado no parametro 1.
	 */
	@NamedQuery(name = "Estado.allByPais", query = "SELECT OBJECT(o) FROM Estado AS o WHERE o.pais = ?1"),
	//.. outras NamedQuerys
})
public class Estado implements Serializable {
	//... outra propriedades

	@ManyToOne(fetch=EAGER)
	private Pais pais;

	//... restante das propriedades e métodos
}
import java.util.List;
import javax.persistence.*;

@Entity
public class Pais implements Serializable {
	//... pripriedades e métodos de pais

	public List<Estado> getEstados(EntityManager em) {
		return (List<Estado>)
			em.
			createNamedQuery("Estado.allByPais").
			setParameter(1, this).
			getResultList();
	}
}

Obs.: a named query que eu coloquei usa EJB QL e não é SQL!! é facil e intuitiva de usar vou colocar dois links abaixo, um com um resuminho, e outro com a syntax:
http://www.dsc.ufcg.edu.br/~jacques/cursos/j2ee/html/ejb/ejbql.htm
http://www.j2ee.me/j2ee/tutorial/1_3-fcs/doc/EJBQL5.html

A

show de bola como toda explicação do Lavieri. vlw mesmo e era essa confirmação que eu estava procurando. vlw. Quanto aos demais colegas muito obrigado pela atenção e pelas resposta. vlw amigos

Criado 7 de agosto de 2009
Ultima resposta 10 de ago. de 2009
Respostas 10
Participantes 5