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 <[email protected]> wrote: > From: Michael Dick <[email protected]> > Subject: Re: Does PrePersist work when merging entities? (2.0.1) > To: [email protected] > 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 <[email protected]> > 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 <[email protected]> > wrote: > > > > > > > > > From: Joel Halbert <[email protected]> > > > > > Subject: Does PrePersist work when > merging entities? (2.0.1) > > > > > To: "[email protected]" > <[email protected]> > > > > > 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 > > > > > > > > > > > > >
