openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Struberg <strub...@yahoo.de>
Subject Re: Does PrePersist work when merging entities? (2.0.1)
Date Wed, 09 Feb 2011 18:34:12 GMT
Yes, but the question is _when_ do we get the PrePersist?

Does the em.persist always write to the database, or only if a database managed id sequence
gets used? 

In this case, I'd say we have a blind spot, because a subsequent change and flush of those
changes will create a subsequent update which isn't covered by a @PreUpdate.

But if the effective storage (and the @PrePersist) only gets called at tran.commit() then
all is fine.

LieGrue,
strub

--- On Wed, 2/9/11, Michael Dick <michael.d.dick@gmail.com> wrote:

> From: Michael Dick <michael.d.dick@gmail.com>
> Subject: Re: Does PrePersist work when merging entities? (2.0.1)
> To: users@openjpa.apache.org
> Date: Wednesday, February 9, 2011, 5:30 PM
> Here's my take :
> 
> In OpenJPA 1.x if you did something like this :
> 
>     Person p;
>     tran.begin();
>     em.persist(p);
> 
>     p.setName("Mike");
>     tran.commit();
> 
> You would get a PrePersist, and a PreUpdate and PostUpdate
> callback. In
> OpenJPA 1.3, and version 2.x you'll only get the PrePersist
> one.
> 
> -mike
> 
> On Wed, Feb 9, 2011 at 9:23 AM, Joel Halbert <joel@su3analytics.com>
> wrote:
> 
> > What's the significance of this, from the docs?
> >
> > "If an entity was updated between the persist() and
> commit() operations
> > in OpenJPA 1.x, then any PreUpdate and PostUpdate life
> cycle callback
> > methods would be executed. Starting in OpenJPA 1.3 and
> 2.0, these
> > callbacks will not get executed."
> >
> > http://openjpa.apache.org/builds/2.0.1/apache-openjpa-2.0.1/docs/manual/main.html
> >
> > Does it mean we should not rely on PreUpdate?
> >
> >
> >
> > On Wed, 2011-02-09 at 15:16 +0000, Joel Halbert
> wrote:
> > > Doh!!! Thanks for clarifying.
> > >
> > > On Wed, 2011-02-09 at 15:13 +0000, Mark Struberg
> wrote:
> > > > Hi Joel!
> > > >
> > > > You might look at @PreUpdate.
> > > >
> > > > @PrePersist only gets called before a
> em.persist() performs the sql
> > INSERT statement. @PreUpdate will get called before
> any sql UPDATE to the
> > entity.
> > > >
> > > > LieGrue,
> > > > strub
> > > >
> > > > --- On Wed, 2/9/11, Joel Halbert <joel@su3analytics.com>
> wrote:
> > > >
> > > > > From: Joel Halbert <joel@su3analytics.com>
> > > > > Subject: Does PrePersist work when
> merging entities? (2.0.1)
> > > > > To: "users@openjpa.apache.org"
> <users@openjpa.apache.org>
> > > > > Date: Wednesday, February 9, 2011, 3:06
> PM
> > > > > Hi Folks,
> > > > >
> > > > > Are there any known issues around
> using  @PrePersist
> > > > > on merge with
> > > > > 2.0,.1?
> > > > > My Entities use Property access.
> > > > >
> > > > > @PostLoad method is always called when
> loading entities.
> > > > > @PrePersist is called on persist, but
> never on merge.
> > > > >
> > > > > I'm tried using both runtime (agent)
> and compile time
> > > > > enhancement.
> > > > >
> > > > > Here's a sample Entity that I used for
> testing this.
> > > > >
> > > > >
> > > > >
> > > > > import javax.persistence.*;
> > > > >
> > > > > @Entity
> > > > > @Access(AccessType.PROPERTY)
> > > > > @Table(name="TEST")
> > > > > public class Test {
> > > > >
> > > > >     private int
> id;
> > > > >     private String
> name;
> > > > >
> > > > >     @Id
> > > > > 
>    @GeneratedValue(strategy =
> > > > > GenerationType.IDENTITY)
> > > > > 
>    @Column(name="ID")
> > > > >     public int
> getId() {
> > > > >     
>    return id;
> > > > >     }
> > > > >     public void
> setId(int id) {
> > > > >     
>    this.id = id;
> > > > >     }
> > > > >
> > > > > 
>    @Column(name="NAME")
> > > > >     public String
> getName() {
> > > > >     
>    return name;
> > > > >     }
> > > > >     public void
> setName(String name) {
> > > > >     
>    this.name = name;
> > > > >     }
> > > > >
> > > > >     @PrePersist
> > > > >     void
> populateDBFields(){
> > > > >
> > > > > System.out.println("Hello, I happen
> prePersist!");
> > > > >     }
> > > > >
> > > > >     @PostLoad
> > > > >     void
> populateTransientFields(){
> > > > >
> > > > > System.out.println("Hello, I happen
> postLoad!");
> > > > >     }
> > > > >
> > > > >     public static
> void main(String[] args)
> > > > > throws Exception {
> > > > >     
>    EntityManagerFactory
> > > > > factory =
> Persistence.createEntityManagerFactory(
> > > > >
> > > > >     "su3", null);
> > > > >     
>    EntityManager em =
> > > > > factory.createEntityManager();
> > > > >
> > > > >     
>    // Test t = new
> > > > > Test();
> > > > >     
>    //
> > > > > t.setName("name");
> > > > >     
>    // em.persist(t);
> > > > >
> > > > >     
>    Test t =
> > > > > em.find(Test.class, 1);
> > > > >     
>    t.setName("new
> > > > > name");
> > > > >     
>    em.merge(t);
> > > > >
> > > > >
> > > > > em.getTransaction().commit();
> > > > >     
>    em.close();
> > > > >
> > > > >     }
> > > > > }
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Any clues?
> > > > >
> > > > > Joel
> > > > >
> > > >
> > > >
> > > >
> > > >
> >
> ____________________________________________________________________________________
> > > > 8:00? 8:25? 8:40? Find a flick in no time
> > > > with the Yahoo! Search movie showtime
> shortcut.
> > > > http://tools.search.yahoo.com/shortcuts/#news
> > >
> > >
> >
> >
> >
> 


      

Mime
View raw message