openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "C N Davies" <...@cndavies.com>
Subject RE: Cascade and persist issues
Date Thu, 01 Oct 2009 14:59:41 GMT
I do something similar, I have a user and a user has a single address so I
use like this:

User:

Private String name;
@OneToOne cascade={CascadeType.ALL})
Private Address address;
....
...

I construct the user, construct the address, link the address to the user
and just use persist on the user which causes the address to be persisted
due to the cascade type. I do the same thing with users that may share the
same address, just the relationship is changed to 

@ManyToOne cascade={CascadeType.ALL})

Chris

-----Original Message-----
From: Laird Nelson [mailto:ljnelson@gmail.com] 
Sent: Friday, 2 October 2009 12:33 AM
To: users@openjpa.apache.org
Subject: Cascade and persist issues

On a field marked @OneToMany(/*...*/ cascade = CascadeType.ALL), I am
getting this error at persist() time:

<openjpa-1.3.0-SNAPSHOT-r422266:820051 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: Encountered new object in
persistent field "blox.party.jpa.PartyEntity.postalAddresses<key:class
blox.party.jpa.PartyPostalAddressBinding$ID>" during attach.  However, this
field does not allow cascade attach. Set the cascade attribute for this
field to CascadeType.MERGE or CascadeType.ALL (JPA annotations) or "merge"
or "all" (JPA orm.xml). You cannot attach a reference to a new object
without cascading.

I am following the advice of http://www.screaming-penguin.com/node/7513 in
terms of structure.

To be specific, I have a Party identified with an autogenerated int PK with
a @OneToMany relationship with a PartyPostalAddressBinding, which has a
@ManyToOne relationship with a PostalAddress.  A PostalAddress, in turn, is
owned by exactly one Party.

In my test case, I persist the Party (then I have to flush(), which is
tremendously irritating) yielding, let's say, party1.  Then I create a new
PostalAddress and assign party1 as its owner.  I persist that (and again
have to flush() in order to avoid errors--no idea why), yielding
postalAddress1.  Finally, I insert a new binding that links party1 and
postalAddress1 into party1's Map of bindings.  I then merge() party1 (which
I don't think I should have to do).  It is at this point that OpenJPA tells
me that my @OneToMany field, with cascade markings all over it, needs to be,
um, marked with CascadeType.ALL, which it is.

I am quite happy to attach all of this, but wanted to see if I'm doing
something obviously stupid first.

Thanks,
Laird


Mime
View raw message