ManyToMany Jpa duvida no relacionamento

11 respostas
furacao123

Estou tentando fazer um relacionamento ManyToMany unidirecional no Jpa com as seguintes classes

Locacao
@JoinTable(name = "locacaobicicleta", joinColumns = {
        @JoinColumn(name = "idlocacao", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "idbicicleta", referencedColumnName = "id", nullable = false)})
    @ManyToMany(fetch = FetchType.LAZY)
    private List<Bicicleta> bicicletaList;

A classe bicicleta nao tem nada pois só me interessa que locação possua uma lista de bicicletas.

no banco de dados tenho uma tabela chamada locacaobicicleta que possui chave composta idlocacao e idbicicleta.

Quanto tento salvar a locação dispara a seguyinte exception
[/code]org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute JDBC batch update; SQL [insert into locacaobicicleta (idlocacao, idbicicleta) values (?, ?)][code]

na saida do console ele dispara o insert da locação e em seguida a locacaobicicleta, mas nao grava nenhum dos 2 o que esta errado?

11 Respostas

A

cara,

coloca cascade = CascadeType.ALL no seu mapeamento.

t+

furacao123

Se eu utilizo o cascade Type All com o persist retorna o objeto Bicicleta como detached, mas esta lista de bicicletas vem de um select.

Exception occurred during event dispatching: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: newbike.model.entity.Bicicleta

Se eu utilizo o merge

Caused by: org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237) 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) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:467) ... 94 more Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into locacaobicicleta (idlocacao, idbicicleta) values (11, 1) foi abortada. Chame getNextException para ver a causa. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) ... 103 more

furacao123

descobri o problema ao tentar utilizar o merge, ele esta tentando inserir sem passar o schema

insert into locacaobicicleta (idlocacao, idbicicleta) values (?, ?)

no relacionamento informei na mao

@JoinTable(name = "app.locacaobicicleta", joinColumns = { @JoinColumn(name = "idlocacao", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = { @JoinColumn(name = "idbicicleta", referencedColumnName = "id", nullable = false)}) @ManyToMany(fetch = FetchType.LAZY, cascade= CascadeType.ALL) private List<Bicicleta> bicicletaList;

dessa forma inseriu corretamente, agora com o persist continua dando detached no objeto Bicicleta mas tranquilo vou utilizar o merge mesmo

drsmachado

Mesmo sendo mapeamento de relação muitos para muitos unidirecional, você ainda precisa indicar, em bicicleta, que existe este relacionamento, para o atributos que contém a lista de locações.

public class Bicicleta{
@ManyToMany(mappedBy="bicicletaList")
//mais código aqui
}
drsmachado

alissonvla:
cara,

coloca cascade = CascadeType.ALL no seu mapeamento.

t+


Cascade.ALL não tem um bom funcionamento com relacionamento @ManyToMany. Gera erros demais.

A

drsmachado, ta ficando doido, qdo vc tem relacionamento unidirecional, é dessa forma que é feita, somente mapeamento em uma classe. E o CascadeType.ALL nao gera erros, vc que deve ta fazendo algo errado.

furacao123, cara esse erro ocorreu pq vc tentando associar uma entidade que é persistente, basta vc dar um find ou um merge na classe que vc criou que vai funcionar.

t+

drsmachado

alissonvla:
drsmachado, ta ficando doido, qdo vc tem relacionamento unidirecional, é dessa forma que é feita, somente mapeamento em uma classe. E o CascadeType.ALL nao gera erros, vc que deve ta fazendo algo errado.

Você leu a minha resposta ou apenas viu a figurinha nela?

Quando você possui mapeamento bidirecional e utiliza Cascade ALL o JPA acusa erro informando que uma entidade não anexada está sendo persistida.

A

cara,

nos meus projetos funcionam perfeitamente, manytomany tanto unidirecional quanto bidirecional com CascadeType.ALL

t+

drsmachado

alissonvla:
cara,

nos meus projetos funcionam perfeitamente, manytomany tanto unidirecional quanto bidirecional com CascadeType.ALL

t+

Bom para você então.

Daqui a pouco vai dizer que coloca vários bags como fetch EAGER e não dá nenhum problema…

A

so rindo de vc msm… hahahaha

fbl.lucas

furacao123:
descobri o problema ao tentar utilizar o merge, ele esta tentando inserir sem passar o schema

insert into locacaobicicleta (idlocacao, idbicicleta) values (?, ?)

no relacionamento informei na mao

@JoinTable(name = "app.locacaobicicleta", joinColumns = { @JoinColumn(name = "idlocacao", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = { @JoinColumn(name = "idbicicleta", referencedColumnName = "id", nullable = false)}) @ManyToMany(fetch = FetchType.LAZY, cascade= CascadeType.ALL) private List<Bicicleta> bicicletaList;

dessa forma inseriu corretamente, agora com o persist continua dando detached no objeto Bicicleta mas tranquilo vou utilizar o merge mesmo

O @JoinTable possui um atributo “schema”, acho melhor utilizar la, pode evitar problemas futuros.

Criado 19 de dezembro de 2011
Ultima resposta 19 de dez. de 2011
Respostas 11
Participantes 4