openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Dick" <michael.d.d...@gmail.com>
Subject Re: How to diagnose rather cryptic error messages
Date Tue, 01 Apr 2008 22:26:25 GMT
On Tue, Apr 1, 2008 at 12:00 PM, David Goodenough <
david.goodenough@btconnect.com> wrote:

> On Tuesday 01 April 2008, Patrick Linskey wrote:
> > >  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):
> Ah, well I think I am in an extended context, being an SE app, not an EE
> one?
> >
> > em.persist(new User());
> > em.getTransaction().begin();
> > em.getTransaction().commit();
> What is the effect of such an apparently null transaction?


Well, the user will be persisted, but that's already been covered. In this
case you are using an extended persistence context which means that the
entities are considered managed even when they're obtained outside of a
transaction. They'll remain managed until the context (em) is closed, or
they're manually detached (ie em.clear()).

So when you begin and commit a transaction the EntityManager will flush
(write) the state of all the entities its managing to the database.

-Mike

>
> >
> > >  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.
> yes, as I said I was trying to get going so I removed the brakes (or
> throught
> I did).
>
> David
> >
> > -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(P
> > >  > >roxyS etupStateManager.java:234) at
> > >  > > uk.co.dga.bm.jpa.User.pcProvideField(User.java)
> > >  > >         at
> > >  > >
> > >  > > org.apache.openjpa.meta.ProxySetupStateManager.setProxyData
> (ProxySet
> > >  > >upSta teManager.java:58) at
> > >  > >
> > >  > > org.apache.openjpa.meta.ClassMetaData.resolveMeta(
> ClassMetaData.java
> > >  > >:1731 ) at
> > >  > >
> > >  > > org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java
> :161
> > >  > >3) at
> > >  > >
> > >  > > org.apache.openjpa.meta.MetaDataRepository.processBuffer
> (MetaDataRep
> > >  > >osito ry.java:675) at
> > >  > >
> > >  > > org.apache.openjpa.meta.MetaDataRepository.resolveMeta
> (MetaDataRepos
> > >  > >itory .java:575) at
> > >  > >
> > >  > > org.apache.openjpa.meta.MetaDataRepository.resolve
> (MetaDataRepositor
> > >  > >y.jav a:500) at
> > >  > >
> > >  > > org.apache.openjpa.meta.MetaDataRepository.getMetaData
> (MetaDataRepos
> > >  > >itory .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
> (EntityManag
> > >  > >erImp 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
>
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message