openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Patrick Linskey" <plins...@gmail.com>
Subject Re: How to diagnose rather cryptic error messages
Date Tue, 01 Apr 2008 16:45:07 GMT
>  Also why does the persist apparently work? Should it now throw an
>  exception if it is used out of a transaction?

Because this is valid in some contexts (extended persistence contexts):

em.persist(new User());
em.getTransaction().begin();
em.getTransaction().commit();

>  To be honest my first code has cascade=CascadeType.ALL just about
>  everwhere, until I get into more details.

Note that this can be dangerous -- CascadeType.REMOVE means that if
you delete an instance, its so-marked related instances will be
deleted also.

-Patrick

On Tue, Apr 1, 2008 at 9:31 AM, David Goodenough
<david.goodenough@btconnect.com> wrote:
> On Tuesday 01 April 2008, Patrick Linskey wrote:
>  > >  Does a persist have to be inside a Transaction?
>  >
>  > In short, yes -- changes will only get written back to the database
>  > within a transaction. IIRC, if you call persist() outside a
>  > transaction and then begin and commit one, the new objects will be
>  > written also.
>  Can I suggest that the manual could be clearer here.  In section 8.2
>  on page 65 it is not obvious whether the comment just above the
>  code box for remove applies to the persist or remove methods.
>
>  Also why does the persist apparently work? Should it now throw an
>  exception if it is used out of a transaction?
>
> >
>  > >  Then create a User object, which amongst other things has a List of
>  > >  Role objects in it, so I add the Role object I just create to it, fill
>  > > in all the other fields, and try to persist it.
>  >
>  > Bear in mind that one of the interesting "features" of the JPA
>  > specification is that when you have a persistent relationship, you
>  > need to either put a 'cascade=CascadeType.PERSIST' (or equivalent)
>  > into the annotation on the relationship, or manually call persist() on
>  > related data, or set the cascade-persist default override switch in
>  > your orm.xml. (Yes, I agree that this is more complicated than it
>  > should be; this is just a warning.)
>  To be honest my first code has cascade=CascadeType.ALL just about
>  everwhere, until I get into more details.
>
>  David
>
>
> >
>  > >  I get back an exception which says:-
>  > >
>  > >  Exception in thread "main" <openjpa-1.0.2-r420667:627158 fatal general
>  > > error> org.apache.openjpa.persistence.PersistenceException: null
>  >
>  > That's definitely not a great error.
>  >
>  > -Patrick
>  >
>  > On Tue, Apr 1, 2008 at 7:04 AM, David Goodenough
>  >
>  > <david.goodenough@btconnect.com> wrote:
>  > > I am relatively new to JPA, and trying to get to grips with what I can
>  > >  and can not do with it.
>  > >
>  > >  So I thought I would try creating a small system (which will grow) which
>  > >  has amongst other things User objects and Role objects in it.
>  > >
>  > >  OpenJPA has successfully taken my list of Entities and created the
>  > >  relevant tables.  The Entity classes have all been enhanced.  I am using
>  > >  OpenJPA 1.0.2.
>  > >
>  > >  I create a Role object (which does not contain a reference to other
>  > >  objects) and persist it.  No errors are reported, but the object does
>  > >  not appear as a record in the DB.  Does a persist have to be inside
>  > >  a Transaction?  The manual is confusing as it says that "this action can
>  > >  only be performed in the context of an active transaction" right at the
>  > >  end of the description of persist, but I read it (given the way it was
>  > >  laid out) to apply to the remove action which immediately follows it.
>  > >
>  > >  Then create a User object, which amongst other things has a List of
>  > >  Role objects in it, so I add the Role object I just create to it, fill
>  > > in all the other fields, and try to persist it.
>  > >
>  > >  I get back an exception which says:-
>  > >
>  > >  Exception in thread "main" <openjpa-1.0.2-r420667:627158 fatal general
>  > > error> org.apache.openjpa.persistence.PersistenceException: null
>  > >         at
>  > >
>  > > org.apache.openjpa.meta.ProxySetupStateManager.providedStringField(ProxyS
>  > >etupStateManager.java:234) at
>  > > uk.co.dga.bm.jpa.User.pcProvideField(User.java)
>  > >         at
>  > >
>  > > org.apache.openjpa.meta.ProxySetupStateManager.setProxyData(ProxySetupSta
>  > >teManager.java:58) at
>  > >
>  > > org.apache.openjpa.meta.ClassMetaData.resolveMeta(ClassMetaData.java:1731
>  > >) at
>  > >  org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1613)
>  > >         at
>  > >
>  > > org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataReposito
>  > >ry.java:675) at
>  > >
>  > > org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository
>  > >.java:575) at
>  > >
>  > > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.jav
>  > >a:500) at
>  > >
>  > > org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository
>  > >.java:302) at
>  > > org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2372) at
>  > > org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2225) at
>  > >
>  > > org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:
>  > >1005) at
>  > >
>  > > org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImp
>  > >l.java:541) at uk.co.dga.bm.loader.CreateUser.run(CreateUser.java:34) at
>  > > uk.co.dga.bm.loader.CreateUser.main(CreateUser.java:41)
>  > >
>  > >  which is not very helpful.  How do I get more information on exactly
>  > > what it is trying to do so that I can fix it?
>  > >
>  > >  David
>



-- 
Patrick Linskey
202 669 5907

Mime
View raw message