Tabela de junção - Hibernate

8 respostas
dtxk

Pessoal bom dia,

Estou tentando salvar uma tabela A que tem uma tabela de junção com a tabela B.

No console exibe assim:

Hibernate: delete from filter_expense where idFilter=?
Hibernate: insert into filter_expense (idFilter, idExpense) values (?, ?)
Hibernate: insert into filter_expense (idFilter, idExpense) values (?, ?)
Hibernate: insert into filter_expense (idFilter, idExpense) values (?, ?)

org.hibernate.exception.ConstraintViolationException: could not insert collection: [A.tabela_junção#35]
 at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1183)
        at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:26)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:145)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)

Caused by: java.sql.SQLException: Violation of PRIMARY KEY constraint 'PK_tabela_junção'. Cannot insert duplicate key in object 'dbo.tabela_junção'.
        at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:365)
        at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2781)
        at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2224)
        at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:628)
        at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:525)
        at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:487)
        at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:421)
        at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
        at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
        at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1146)

Minha dúvida é o seguinte se o hibernate esta deletando como exibe acima, porque no ato de salvar ele reclama que está duplicado? alguem ja mecheu com isso?

O relacionamento é ManytoMany como segyue:

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "tabela_junçao", joinColumns = { @JoinColumn(name = "idFilter", nullable = false, updatable = false)}, inverseJoinColumns = { @JoinColumn(name = "idExpense", nullable = false, updatable = false)}) public List<TabelaB> getTabelaB() { return this.expenseses; }

Fico no aguardo obrigado

8 Respostas

drsmachado

A questão é que essa mensagem

Caused by: java.sql.SQLException: Violation of PRIMARY KEY constraint 'PK_tabela_junção'. Cannot insert duplicate key in object 'dbo.tabela_junção'.

se refere à uma violação da integridade do banco de dados.
Nenhuma PK pode ser duplicada, ela deve ser única.
Há algum equívoco ou no mapeamento ou na forma como você está efetuando esse processo.

fbl.lucas

Quem é a PK da tabela_junção?

Tabelas de junção devem ter chave composta, os campos idFilter e idExpense deveriam compor a PK.

dtxk

fbl.lucas:
Quem é a PK da tabela_junção?

Tabelas de junção devem ter chave composta, os campos idFilter e idExpense deveriam compor a PK.

Olá amigos,

Então hoje as colunas idFilter e idExpense são pk’s

Se eu tiro as PK’s do banco ele realmente vai salvar duplicado.

Não sei mais oque poderia ser…

drsmachado

fbl.lucas:
Quem é a PK da tabela_junção?

Tabelas de junção devem ter chave composta, os campos idFilter e idExpense deveriam compor a PK.


Acho que a primeira pergunta a ser respondida é, quem criou as tabelas?
Você ou o hibernate?

dtxk

drsmachado:
fbl.lucas:
Quem é a PK da tabela_junção?

Tabelas de junção devem ter chave composta, os campos idFilter e idExpense deveriam compor a PK.


Acho que a primeira pergunta a ser respondida é, quem criou as tabelas?
Você ou o hibernate?

Eu criei as tabelas… no exemplo que eu postei acima eu tirei os nomes originais porque não posso colocar o nome da empresa em foruns. Apenas isso

fbl.lucas

ja experimentou retirar o updatable = false ? não faz muito sentido pois você colocou como CascadeType.ALL

dtxk

Não resolveu não… Mais alguêm saberia como resolver isso? Estou desde manhã tentando resolverr e até agora nada :S

drsmachado

dtxk:
drsmachado:
fbl.lucas:
Quem é a PK da tabela_junção?

Tabelas de junção devem ter chave composta, os campos idFilter e idExpense deveriam compor a PK.


Acho que a primeira pergunta a ser respondida é, quem criou as tabelas?
Você ou o hibernate?

Eu criei as tabelas… no exemplo que eu postei acima eu tirei os nomes originais porque não posso colocar o nome da empresa em foruns. Apenas isso

Então aí está o problema.
Qual a estrutura da tabela?
Qual(ais) é(são) a(s) PK(s)?
É uma chave composta?

Criado 21 de dezembro de 2011
Ultima resposta 21 de dez. de 2011
Respostas 8
Participantes 3