Ajuda com hibernate, problema de relacionamento ManyToMany

4 respostas
B

Galera,

To com um problema de mapeamento (acho). Tenho uma tabela USUARIOS e uma tabela GRUPOS_USURIOS. Tenho tb uma tabela associativa GRUPO_USUARIOS_USUARIOS. Tenho uma classe Java com annotations para a tabela USUARIOS e uma para a tabela GRUPO_USUARIOS.

  1. Existe a necessidade de se criar uma classe java com annotations para a tabela associativa? Se sim, como seria isso?

  2. Caso nao seja o problema acima, AONDE eu coloco o @ManyToMany? Na declaração da variável ou na declaração do método?

Segue abaixo o código e o stack:

UsuarioDTO.java ... @ManyToMany( targetEntity=com.mc.dto.GrupoUsuarioDTO.class, cascade=CascadeType.ALL ) @JoinTable( name="MC_GRUPOS_USUARIOS", joinColumns={@JoinColumn(name="idUsuario")}, inverseJoinColumns={@JoinColumn(name="idGrupoUsuario")} ) private Set<GrupoUsuarioDTO> grupos; ... ... ... public Set<GrupoUsuarioDTO> getGrupos() { return this.grupos; } public void setGrupos(Set<GrupoUsuarioDTO> grupos) { this.grupos = grupos; } ...

GrupoUsuarioDTO.java ... @ManyToMany( targetEntity=com.mc.dto.UsuarioDTO.class, cascade=CascadeType.ALL ) @JoinTable( name="MC_USUARIOS", joinColumns={@JoinColumn(name="idGrupoUsuario")}, inverseJoinColumns={@JoinColumn(name="idUsuario")} ) private Set<UsuarioDTO> usuarios; ... ... ... public Set<UsuarioDTO> getUsuarios() { return this.usuarios; } public void setUsuarios(Set<UsuarioDTO> usuarios) { this.usuarios = usuarios; } ...

UsuarioDAO.java ... public UsuarioDTO efetuaLogin(String usuario, String senha) { UsuarioDTO object = null; HibernateUtil HibernateUtil = new HibernateUtil(); try{ Session hibernate = HibernateUtil.getSessao(); Query query = hibernate.createQuery("from UsuarioDTO where usuario = '" + usuario + "' AND senha = md5('" + senha + "') AND status = 'ativo'"); object = (UsuarioDTO) query.uniqueResult(); //HibernateUtil.getSessao().lock(object,LockMode.NONE); //Hibernate.initialize(object.getGrupos()); HibernateUtil.confirma(); } catch(Exception e){ e.printStackTrace(); HibernateUtil.aborta(); } return object; } ...

Stack: org.hibernate.MappingException: Could not determine type for: java.util.Set, for columns: [org.hibernate.mapping.Column(grupos)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266) at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253) at org.hibernate.mapping.Property.isValid(Property.java:185) at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:410) at org.hibernate.mapping.RootClass.validate(RootClass.java:192) at org.hibernate.cfg.Configuration.validate(Configuration.java:1026) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1211) at com.mc.util.HibernateUtil.getSessao(HibernateUtil.java:32) at com.mc.dao.UsuarioDAO.efetuaLogin(UsuarioDAO.java:36) at com.mc.teste.Main.main(Main.java:18) java.lang.NullPointerException at com.mc.dao.UsuarioDAO.efetuaLogin(UsuarioDAO.java:37) at com.mc.teste.Main.main(Main.java:18) org.hibernate.MappingException: Could not determine type for: java.util.Set, for columns: [org.hibernate.mapping.Column(grupos)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266) at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253) at org.hibernate.mapping.Property.isValid(Property.java:185) at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:410) at org.hibernate.mapping.RootClass.validate(RootClass.java:192) at org.hibernate.cfg.Configuration.validate(Configuration.java:1026) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1211) at com.mc.util.HibernateUtil.getSessao(HibernateUtil.java:32) at com.mc.util.HibernateUtil.fechaSessao(HibernateUtil.java:62) at com.mc.util.HibernateUtil.aborta(HibernateUtil.java:84) at com.mc.dao.UsuarioDAO.efetuaLogin(UsuarioDAO.java:45) at com.mc.teste.Main.main(Main.java:18) Exception in thread "main" java.lang.NullPointerException at com.mc.teste.Main.main(Main.java:19)

Alguém sabe me falar o que pode estar acontecendo?

Desde já, obrigado.

4 Respostas

zepunk

Bom segue um exemplo de um relacionamente ManyToMany.
Neste caso eu tenho uma Entidade OrdemServico e uma Usuario. Onde cada usuário pode ter várias ordensdeServico e cada ordem de servico pode ter vários usuários.

OrdemServico

@ManyToMany
	@JoinTable(name = "OrdemServico_Usuario", uniqueConstraints = { @UniqueConstraint(columnNames = {
			"idOrdemServico", "idUsuario" }) }, joinColumns = @JoinColumn(name = "idOrdemServico", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "idUsuario", referencedColumnName = "id"))
	public Set&lt;Usuario&gt; getUsuarios() {
		return usuarios;
	}

Usuario

@ManyToMany(mappedBy="usuarios")
	public Set&lt;OrdemServico&gt; getOrdemServico() {
		return ordemServico;
	}
B

onde entra a tabela associativa aí?

B

A sua classe OrdemServico faz o mapeamento para a tabela associativa? Num é para a tabela de usuarios nao?

zepunk

A tabela associativa é a “OrdemServico_Usuario” que esta citada no @JoinTable(name = “OrdemServico_Usuario”

Criado 26 de dezembro de 2006
Ultima resposta 26 de dez. de 2006
Respostas 4
Participantes 2