Problema em @ManyToOne com TopLink

2 respostas
javer

Tenho uma entidade Cliente que pode ter um vendedor ou não, de qualquer maneira quando não houver vendedor o código será zero.

O que acontece é que se eu coloco cascade = CascadeType.PERSIST ele vai inserir um vendedor no cadastro, eu preciso apenas que ele salve o código do vendedor na coluna CODIGO_VENDEDOR, por outro lado se não coloco cascade = CascadeType.PERSIST ele dá a seguinte exceção:

[TopLink Warning]: 2009.12.29 04:55:36.718--UnitOfWork(31979889)--java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: class horus.bean.Vendedor. at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork$1.iterate(RepeatableWriteUnitOfWork.java:140) at oracle.toplink.essentials.internal.descriptors.DescriptorIterator.internalIterateReferenceObject(DescriptorIterator.java:189) at oracle.toplink.essentials.internal.descriptors.DescriptorIterator.iterateReferenceObjectForMapping(DescriptorIterator.java:296) at oracle.toplink.essentials.mappings.ObjectReferenceMapping.iterateOnRealAttributeValue(ObjectReferenceMapping.java:269) at oracle.toplink.essentials.internal.indirection.IndirectionPolicy.iterateOnAttributeValue(IndirectionPolicy.java:222) at oracle.toplink.essentials.mappings.ForeignReferenceMapping.iterate(ForeignReferenceMapping.java:587) at oracle.toplink.essentials.internal.descriptors.ObjectBuilder.iterate(ObjectBuilder.java:2099) at oracle.toplink.essentials.internal.descriptors.DescriptorIterator.iterateReferenceObjects(DescriptorIterator.java:311) at oracle.toplink.essentials.internal.descriptors.DescriptorIterator.startIterationOn(DescriptorIterator.java:484) at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:161) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.discoverAllUnregisteredNewObjects(UnitOfWorkImpl.java:1292) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.assignSequenceNumbers(UnitOfWorkImpl.java:382) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.collectAndPrepareObjectsForCommit(UnitOfWorkImpl.java:721) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1112) at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:107) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:856) at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:102) at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60) at horus.dao.ClienteDAO.inserir(ClienteDAO.java:28)

Entidade Cliente.java:

... @ManyToOne(optional = true) //(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @JoinColumn(name = "CODIGO_VENDEDOR", nullable = false, updatable = true) public Vendedor getVendedor() { return vendedor; }

Como resolvo isso?

2 Respostas

B

Mostre como você está fazendo para persistir a entidade cliente…

nbluis

Faz um load no vendedor antes de inserir.

Criado 29 de dezembro de 2009
Ultima resposta 29 de dez. de 2009
Respostas 2
Participantes 3