Não consigo gravar dados em uma relação ManyToMany

Boa Tarde Galera.

Estou com o seguinte problema tenho duas classes “Dependente” e “Paciente” e um relacionamento ManyToMany, consigo gravar o primeiro cadastro tranquilo, cadastro um paciente e logo em seguida um dependente relacionando com este paciente.

Agora entra o problema, quando tento gravar este dependente para outro paciente, ele simplesmente não grava nada e também não da erro algum.

O hibernate criou um tabela chamada “dependente_paciente”, quando gravo o primeiro registro ele insere nesta tabela, já quando vou tentar fazer outro cadastro ele não grava nada.

O sistema está me trazendo os dados de paciente e dependente, só que não grava.

Meu relacionamento

@ServerOnly
@ManyToMany
@AccessType(value="field")
@JoinColumn(name="pacientes")
private List<Paciente> pacientes;

Meu metodo para gravar

dependente.setEstado(estadoDep);
dependente.addPaciente(paciente);
dependente.setNome(cbDependente.getRawValue());
dependente.setCpf(tfCpfDep.getValue());
dependente.setDtnascimento(dtNascDep);
dependente.setSexo(sexoDep);
servico.gravarDependente(dependente, new AsyncCallback<Dependente>() {
	public void onFailure(Throwable caught) {
		com.google.gwt.user.client.Window
				.alert("Falha ao Gravar ou Alterar Dependente....."
						+ caught);
		
	}

	public void onSuccess(Dependente result) {
	          Info.display("Dependente alterado",
					"Alterado dependente {0} ", result.getNome()
							+ "... Alterado com sucesso.");
	
	}
});

Minha persistencia

session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.flush();
entidade = (T) session.merge(entidade);
tx.commit();

não entendi bem o problema. como estão mapeadas suas classes do hibernate?

Bom Dia Galera.

O Mapeamento é feito através do hibernate.cfg.xml:


<mapping class="br.com.agsisistemas.client.entidade.Paciente"/> 
<mapping class="br.com.agsisistemas.client.entidade.Dependente"/> 

e o Relacionamento é feito pela classe Dependente:


@ServerOnly
@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE} )
@AccessType(value="field")
@JoinColumn(name="pacientes")
private List<Paciente> pacientes;

Obrigado.

tente mapear sua classe dependente dessse jeito:

@ManyToMany @JoinTable(name = "NOME_TABELA_DEPENDETE", joinColumns = { @JoinColumn(name = "IDDEPENDENTE")}, inverseJoinColumns={@JoinColumn(name="IDPACIENTE")}) private Set<br.com.agsisistemas.client.entidade.Paciente> pacientes;

Boa Tarde.

Tentei fazer da forma que você passou, mais mapeando dessa forma ele me deixa criar as tabelas mas dá erro na hora de gravar os dados.

Segue o erro.

Initial SessionFactory creation failed.org.hibernate.MappingException: Repeated column in mapping for collection: br.com.agsisistemas.client.entidade.Dependente.pacientes column: codigo
Exception in thread “main” java.lang.ExceptionInInitializerError
at br.com.agsisistemas.server.dao.HibernateUtil.(HibernateUtil.java:15)
at br.com.agsisistemas.server.dao.GenericDao.add(GenericDao.java:20)
at br.com.agsisistemas.server.RpcProjetoImpl.gravarTipoDependente(RpcProjetoImpl.java:86)
at br.com.agsisistemas.server.TesteConexao.main(TesteConexao.java:35)
Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: br.com.agsisistemas.client.entidade.Dependente.pacientes column: codigo
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:329)
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:352)
at org.hibernate.mapping.Collection.validate(Collection.java:309)
at org.hibernate.mapping.Set.validate(Set.java:42)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1139)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at br.com.agsisistemas.server.dao.HibernateUtil.(HibernateUtil.java:12)
… 3 more

meu mapeamento:

@ServerOnly
@ManyToMany
@AccessType(value="field")
@JoinTable(name="dependente", 
	joinColumns={@JoinColumn(name="codigo")},
	inverseJoinColumns={@JoinColumn(name="codigo")})
private Set<Paciente> pacientes;

Obrigado.

O nome da tabela está errado… não é a tabela dependente. seria sua muitos para muitos.
Coloca aki o script da tabela muito para muitos pra eu ver.

Valeu.