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.
>
>