You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Anonimus <sa...@gmail.com> on 2008/06/11 15:52:05 UTC
Re: How to PERSIST object without loading references?
Ognjen Blagojevic wrote:
>
> It must be a way to INSERT objects in the database without looking up
> for all the references, but I am not able to find it.
>
My problem is similar as yours, with a single difference.
I don't mind loading all the references because I need them in the program.
But I don't know how to insert object and disable an attempt of inserting in
related tables. If I put cascade = cascadeType.PERSIST, I get an exception
(as you do). If I don't put cascade = cascadeType.PERSIST (which is
logical), I get an exception. Since I'm new in JPA, I'm quite lost now.
--
View this message in context: http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17778155.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.
Re: How to PERSIST object without loading references?
Posted by Fay Wang <fy...@yahoo.com>.
Hi Enrico,
Here is my example, and it runs fine:
(1) EntityA.java:
@Entity
public class EntityA {
@Column(name="A_ID")
@Id private int id;
private String name;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({@JoinColumn(name="B_ID",
referencedColumnName="B_ID",
insertable=false,updatable=false)})
private EntityB entityB;
... omit getters and setters
}
(2) EntityB:
@Entity
public class EntityB {
@Column(name="B_ID")
@Id private int id;
private String name;
... omit getters and setters
}
(3) the test case:
em.getTransaction().begin();
EntityA a = new EntityA();
a.setName("1");
a.setId(1);
em.persist(a);
em.getTransaction().commit();
Do you want to try my test case to see if it works?
-f
--- On Wed, 6/11/08, Enrico Goosen <eg...@metropolitan.co.za> wrote:
> From: Enrico Goosen <eg...@metropolitan.co.za>
> Subject: Re: How to PERSIST object without loading references?
> To: users@openjpa.apache.org
> Date: Wednesday, June 11, 2008, 11:44 AM
> I'm getting so frustrated with OpenJPA!
> I'm also experiencing the problem listed in previous
> reply, and once again,
> no response to that post.
> Here's some code to explain my problem:
> TblPdtbnf.java:
> @OneToOne(fetch = FetchType.LAZY)
> @JoinColumns({@JoinColumn(name
> ="PDTBNF_ID",referencedColumnName="PDTBNF_ID",insertable=false,updatable=false)})
>
> private TblPdtbnfcde tblPdtbnfcde;
>
> When I save a TblPdtbnf record, I get this error:
> ERRORJun 11 20:30:12 Encountered new object
> "za.co.metcapri.model.ebstatus.TblPdtbnfcde@114b3af"
> in persistent field
> "za.co.metcapri.model.ebstatus.TblPdtbnf.tblPdtbnfcde"
> of managed object
> "za.co.metcapri.model.ebstatus.TblPdtbnf@87c7a8"
> during attach. However,
> this field does not allow cascade attach. You cannot
> attach a reference to
> a new object without cascading.;
>
> But I don't want to save the tblPdtbnfcde...didn't
> I make that clear by
> adding insertable=false!!!
>
> If I remove insertable=false, updatable=false...that
> doesn't help either.
>
> Do I have to set that field to null to save this record?
> There must be a better way.
>
> Is there anybody out there that knows the solution???
>
>
> Anonimus wrote:
> >
> >
> > Ognjen Blagojevic wrote:
> >>
> >> It must be a way to INSERT objects in the database
> without looking up
> >> for all the references, but I am not able to find
> it.
> >>
> >
> > My problem is similar as yours, with a single
> difference.
> > I don't mind loading all the references because I
> need them in the
> > program. But I don't know how to insert object and
> disable an attempt of
> > inserting in related tables. If I put cascade =
> cascadeType.PERSIST, I get
> > an exception (as you do). If I don't put cascade =
> cascadeType.PERSIST
> > (which is logical), I get an exception. Since I'm
> new in JPA, I'm quite
> > lost now.
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17784459.html
> Sent from the OpenJPA Users mailing list archive at
> Nabble.com.
Re: How to PERSIST object without loading references?
Posted by Enrico Goosen <eg...@metropolitan.co.za>.
I'm getting so frustrated with OpenJPA!
I'm also experiencing the problem listed in previous reply, and once again,
no response to that post.
Here's some code to explain my problem:
TblPdtbnf.java:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({@JoinColumn(name
="PDTBNF_ID",referencedColumnName="PDTBNF_ID",insertable=false,updatable=false)})
private TblPdtbnfcde tblPdtbnfcde;
When I save a TblPdtbnf record, I get this error:
ERRORJun 11 20:30:12 Encountered new object
"za.co.metcapri.model.ebstatus.TblPdtbnfcde@114b3af" in persistent field
"za.co.metcapri.model.ebstatus.TblPdtbnf.tblPdtbnfcde" of managed object
"za.co.metcapri.model.ebstatus.TblPdtbnf@87c7a8" during attach. However,
this field does not allow cascade attach. You cannot attach a reference to
a new object without cascading.;
But I don't want to save the tblPdtbnfcde...didn't I make that clear by
adding insertable=false!!!
If I remove insertable=false, updatable=false...that doesn't help either.
Do I have to set that field to null to save this record?
There must be a better way.
Is there anybody out there that knows the solution???
Anonimus wrote:
>
>
> Ognjen Blagojevic wrote:
>>
>> It must be a way to INSERT objects in the database without looking up
>> for all the references, but I am not able to find it.
>>
>
> My problem is similar as yours, with a single difference.
> I don't mind loading all the references because I need them in the
> program. But I don't know how to insert object and disable an attempt of
> inserting in related tables. If I put cascade = cascadeType.PERSIST, I get
> an exception (as you do). If I don't put cascade = cascadeType.PERSIST
> (which is logical), I get an exception. Since I'm new in JPA, I'm quite
> lost now.
>
>
--
View this message in context: http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17784459.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.
Re: How to PERSIST object without loading references?
Posted by Anonimus <sa...@gmail.com>.
I've solved my problem by replaceing
em.persist(e);
with
e = (Employee) em.merge(e);
It works now.
--
View this message in context: http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17803850.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.
Re: How to PERSIST object without loading references?
Posted by Anonimus <sa...@gmail.com>.
Hi Michael,
your assumptions are correct.
After em.persist(e); I get this exception if I specify CascadeType.PERSIST:
>org.apache.openjpa.persistence.InvalidStateException: The generated value
> processing detected an existing value assigned to this field:
> mypackage.Department.idDepartment. This existing value was either
> provided
> via an initializer or by calling the setter method. You either need to
> remove the @GeneratedValue annotation or modify the code to remove the
> initializer processing.
because id in referenced object has an annotation
@GeneratedValue(strategy=GenerationType.IDENTITY) and that is something I
cannot and don't want to change.
If I don't specify CascadeType.PERSIST, I get this error:
> <openjpa-1.0.2-r420667:627158 nonfatal user error>
> org.apache.openjpa.persistence.InvalidStateException: Encountered
> unmanaged object "mypackage.Department@18952cc" in persistent field
> "mypackage.Employee.idDepartment" of managed object
> "mypackage.Employee-5" during flush. However, this field does not allow
> to be CascadeType.PERSIST. You cannot flush unmanaged objects.
Michael Dick wrote:
>
> Hi Anonimus,
>
> What exception do you get when you don't specify CascadeType.PERSIST?
>
> I'm assuming you're doing something like this :
>
> Employee e = new Employe();
> e.setName("John Doe");
>
> Department d = em.find(Department.class, idDept); // this is what I think
> you mean by loading all the references.
> e.setIdDepartment(d);
>
> Rank r = em.find(Rank.class, idRank);
> e.setIdRank(r);
>
> // and so on
>
> em.persist(e);
>
> If that's the case then you shouldn't get any exceptions.
>
> Thanks,
>
> -Mike
>
> On Wed, Jun 11, 2008 at 8:52 AM, Anonimus <sa...@gmail.com> wrote:
>
>>
>>
>> Ognjen Blagojevic wrote:
>> >
>> > It must be a way to INSERT objects in the database without looking up
>> > for all the references, but I am not able to find it.
>> >
>>
>> My problem is similar as yours, with a single difference.
>> I don't mind loading all the references because I need them in the
>> program.
>> But I don't know how to insert object and disable an attempt of inserting
>> in
>> related tables. If I put cascade = cascadeType.PERSIST, I get an
>> exception
>> (as you do). If I don't put cascade = cascadeType.PERSIST (which is
>> logical), I get an exception. Since I'm new in JPA, I'm quite lost now.
>>
>> --
>> View this message in context:
>> http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17778155.html
>> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>>
>>
>
>
--
View this message in context: http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17787968.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.
Re: How to PERSIST object without loading references?
Posted by Michael Dick <mi...@gmail.com>.
Hi Anonimus,
What exception do you get when you don't specify CascadeType.PERSIST?
I'm assuming you're doing something like this :
Employee e = new Employe();
e.setName("John Doe");
Department d = em.find(Department.class, idDept); // this is what I think
you mean by loading all the references.
e.setIdDepartment(d);
Rank r = em.find(Rank.class, idRank);
e.setIdRank(r);
// and so on
em.persist(e);
If that's the case then you shouldn't get any exceptions.
Thanks,
-Mike
On Wed, Jun 11, 2008 at 8:52 AM, Anonimus <sa...@gmail.com> wrote:
>
>
> Ognjen Blagojevic wrote:
> >
> > It must be a way to INSERT objects in the database without looking up
> > for all the references, but I am not able to find it.
> >
>
> My problem is similar as yours, with a single difference.
> I don't mind loading all the references because I need them in the program.
> But I don't know how to insert object and disable an attempt of inserting
> in
> related tables. If I put cascade = cascadeType.PERSIST, I get an exception
> (as you do). If I don't put cascade = cascadeType.PERSIST (which is
> logical), I get an exception. Since I'm new in JPA, I'm quite lost now.
>
> --
> View this message in context:
> http://www.nabble.com/How-to-PERSIST-object-without-loading-references--tp16472647p17778155.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>
>