JPA During synchronization a new object [Resolvido]

Boa tarde, estou trabalhando com Jpa e tenho duas tabelas, Pessoa e Cor com relação @ManyToOne, neste momento estou setando Cor manualmente mas quando o id da Cor é 0 dá o seguinte erro:

Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.com.prog.entity.Cor[contador=0].
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObjects(UnitOfWorkImpl.java:4104)
        at org.eclipse.persistence.mappings.ObjectReferenceMapping.cascadeDiscoverAndPersistUnregisteredNewObjects(ObjectReferenceMapping.java:873)
        at org.eclipse.persistence.mappings.ObjectReferenceMapping.cascadeDiscoverAndPersistUnregisteredNewObjects(ObjectReferenceMapping.java:851)
        at org.eclipse.persistence.internal.descriptors.ObjectBuilder.cascadeDiscoverAndPersistUnregisteredNewObjects(ObjectBuilder.java:1788)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObjects(UnitOfWorkImpl.java:4107)
        at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:289)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:690)
        at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:414)
        at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:744)
        at com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush(EntityManagerWrapper.java:418)
        at br.com.automatiza.netcontrol.service.impl.ServiceImpl.insert(ServiceImpl.java:71)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
        at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
        at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5367)
        at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
        at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:862)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
        at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:371)
        at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5339)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5327)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invo
GRAVE: ke(EJBLocalObjectInvocationHandler.java:214)

Chama o entityManager.persist(cor) antes de atribuí-lo à pessoa.

Você pode também usar a marcação @ManyToOne(cascade=cascadeType.Persist), para não ter que ficar sempre persistindo a Cor. Com essa marcação sempre que o JPA for persistir uma pessoa com uma cor não salva no banco, ele salva a cor e o relacionamento também.

@ManyToOne(cascade=cascadeType.Persist)
private Cor cor;

Att,

agradeço pela ajuda mas o registro de cor já existe, então dá o erro de violation of PRIMARY, eu queria que ao inserir uma pessoa ignorar a cor, e é o que acontece quando o id é >=1, mas quando é zero o jpa tenta inserir a cor.

Se o registro já existe, você deve buscá-lo na base e utilizar o set dele para o objeto pessoa.

Vc não pode simplesmente ignorar pois se passar null (por exemplo) o JPA irá apagar esse relacionamento.

Cara recuperei diretamente do banco antes de inserir funcionou porem é um processamento desnecessário, infelizmente o campo não pode ser nulo.

[quote=javaimae]Cara recuperei diretamente do banco antes de inserir funcionou porem é um processamento desnecessário, infelizmente o campo não pode ser nulo.[/quote] Prometo para você que não é desnecessário, é assim que o JPA funciona.

O que você pode tentar fazer, é utiliza um método entityManager.getReference() que ele vai fazer o select apenas no ID e a sua consulta será menor.

Creio que funcionará, pelo menos, foi oq eu li no livro. ^^

Obrigado pela ajuda já que tem que ser assim, que seja.

Caras, me perdoem por estar ressuscitando esse tópico. Mas não estou conseguindo resolver esse problema.
utilizando o exemplo ao amigo “javaimae”, eu segui a sugestão do “Herbert Coelho” :

Porém o erro persistem em acontecer.

Obs.: Eu só estou fazendo commit no final de tudo, mas persisto ambos objetos antes.

Desde ja agradeço.