That is my concern I should only have one copy of a storeType for many Store
entries. So if I add a record on the "one" side (Store) of a one-to-many"
relationship and have a relation set to an existing "Many" side (StoreType) I
don't want a new "Many" side record created as this would be a duplicate.

It seems unless I specify a cascade.Merge/Persist on the relationship field I
cannot persist a new Store with a relationship to a StoreType record even though
the StoreType record exists and does not need merging/persisting. What I am
looking to do is only persist data on the "one" side of the relationship and
never the "Many". 

Make sense or just crazy coding?

Phill
-----Original Message-----
From: Marc Prud'hommeaux [mailto:[EMAIL PROTECTED] On Behalf Of Marc
Prud'hommeaux
Sent: April 24, 2007 2:23 PM
To: open-jpa-dev@incubator.apache.org
Subject: Re: Cascade question (ver 0.96)

Phill-

> The behaviour I am looking for is simply persist the relation (i.e. 
> the link field)

If you specify cascade=MERGE on the StoreType relation field, and you merge a
Store instance for which the StoreType relation doesn't already exists, does it
not persist the field as if it were new?  
That's the behavior I would expect...



On Apr 23, 2007, at 9:55 PM, Phill Moran wrote:

> Here is a scenario that shows odd behaviour, I want to see if it is 
> expected or not. The docs are not clear on it
>
> If I have a many to one relationship for objects Store to Store Type 
> and I create a new Store and assign it to an existing Store type does 
> this relationship have to have cascasdeType.persist set when I issue a 
> merge on the new Store? I had recently removed this as I thought I did 
> not want to create a duplicate Store Type whenever I added a new  
> Store. It seems OpenJPA throws the attached exception when I only have 
> CascadeType.Refresh set.
> Alternatively, this could just be a poorly worded exception/ 
> documentation meaning OpenJPA would check for the existence of this 
> Store Type and not actually persist it if it exists. The behaviour I 
> am looking for is simply persist the relation (i.e. the link field)
>
> Thanks,
>       Phill
> <4|false|0.9.6-incubating>
> org.apache.openjpa.persistence.ArgumentException:
> Encountered new object
> "ca.BidSpec.emall.categories.Category-105603b-508b-9c6-00f4-4031ba6429
> e3:0" in
> persistent field "ca.BidSpec.emall.stores.Store.type" of managed 
> object "[EMAIL PROTECTED]" during attach.  However, 
> this field does not allow cascade attach.  You cannot attach a 
> reference to a new object without cascading.
> FailedObject:
> ca.BidSpec.emall.categories.Category-105603b-508b-9c6-00f4-4031ba6429e
> 3:0
>       at
> org.apache.openjpa.kernel.AttachStrategy.getReference
> (AttachStrategy.java:272)
>       at
> org.apache.openjpa.kernel.AttachStrategy.attachField
> (AttachStrategy.java:189)
>       at
> org.apache.openjpa.kernel.VersionAttachStrategy.attach
> (VersionAttachStrategy.jav
> a:130)
>       at
> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:236)
>       at org.apache.openjpa.kernel.AttachManager.attach
> (AttachManager.java:97)
>       at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3124)
>       at
> org.apache.openjpa.kernel.DelegatingBroker.attach
> (DelegatingBroker.java:1120)
>       at
> org.apache.openjpa.persistence.EntityManagerImpl.merge
> (EntityManagerImpl.java:59
> 1)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
>       at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.jav
> a:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at
> org.springframework.orm.jpa.ExtendedEntityManagerCreator
> $ExtendedEntityManagerIn
> vocationHandler.invoke(ExtendedEntityManagerCreator.java:283)
>       at $Proxy37.merge(Unknown Source)
>       at
> ca.BidSpec.emall.persistence.JPAPersistenceFactory.merge
> (JPAPersistenceFactory.j
> ava:95)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
>       at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.jav
> a:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflectio
> n(AopUtils
> .java:304)
>       at
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke
> (JdkDynamicAopProxy.j
> ava:197)
>       at $Proxy35.merge(Unknown Source)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
>       at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.jav
> a:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflectio
> n(AopUtils
> .java:304)
>       at
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoi
> npoint(Ref
> lectiveMethodInvocation.java:172)
>       at
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
> (ReflectiveM
> ethodInvocation.java:139)
>       at
> org.springframework.transaction.interceptor.TransactionInterceptor.inv
> oke(Transa
> ctionInterceptor.java:107)
>       at
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
> (ReflectiveM
> ethodInvocation.java:161)
>       at
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke
> (JdkDynamicAopProxy.j
> ava:203)
>       at $Proxy35.merge(Unknown Source)
>       at
> ca.BidSpec.testing.emall.StoreFactoryTest.testSave
> (StoreFactoryTest.java:69)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at
> sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:39)
>       at
> sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.jav
> a:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at junit.framework.TestCase.runTest(TestCase.java:168)
>       at junit.framework.TestCase.runBare(TestCase.java:134)
>       at
> org.springframework.test.ConditionalTestCase.runBare
> (ConditionalTestCase.java:69
> )
>       at
> org.springframework.test.annotation.AbstractAnnotationAwareTransaction
> alTests.ac
> cess$001(AbstractAnnotationAwareTransactionalTests.java:47)
>       at
> org.springframework.test.annotation.AbstractAnnotationAwareTransaction
> alTests$1.
> run(AbstractAnnotationAwareTransactionalTests.java:115)
>       at
> org.springframework.test.annotation.AbstractAnnotationAwareTransaction
> alTests.ru
> nTest(AbstractAnnotationAwareTransactionalTests.java:180)
>       at
> org.springframework.test.annotation.AbstractAnnotationAwareTransaction
> alTests.ru
> nTestTimed(AbstractAnnotationAwareTransactionalTests.java:153)
>       at
> org.springframework.test.annotation.AbstractAnnotationAwareTransaction
> alTests.ru
> nBare(AbstractAnnotationAwareTransactionalTests.java:111)
>       at
> org.springframework.test.jpa.AbstractJpaTests.runBare
> (AbstractJpaTests.java:159)
>       at
> org.springframework.test.jpa.AbstractJpaTests.runBare
> (AbstractJpaTests.java:239)
>       at junit.framework.TestResult$1.protect(TestResult.java:110)
>       at junit.framework.TestResult.runProtected(TestResult.java:128)
>       at junit.framework.TestResult.run(TestResult.java:113)
>       at junit.framework.TestCase.run(TestCase.java:124)
>       at junit.framework.TestSuite.runTest(TestSuite.java:232)
>       at junit.framework.TestSuite.run(TestSuite.java:227)
>       at
> org.junit.internal.runners.OldTestClassRunner.run
> (OldTestClassRunner.java:35)
>       at
> org.junit.internal.runners.CompositeRunner.run(CompositeRunner.java: 
> 29)
>       at
> org.junit.internal.runners.TestClassRunner$1.runUnprotected
> (TestClassRunner.java
> :42)
>       at
> org.junit.internal.runners.BeforeAndAfterRunner.runProtected
> (BeforeAndAfterRunne
> r.java:34)
>       at
> org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java: 
> 52)
>       at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
> (JUnit4TestReferen
> ce.java:38)
>       at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run
> (TestExecution.java:38)
>       at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
> (RemoteTestRunner
> .java:460)
>       at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
> (RemoteTestRunner
> .java:673)
>       at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
> (RemoteTestRunner.java
> :386)
>       at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
> (RemoteTestRunner.jav
> a:196)
>

Reply via email to