You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by David Beer <da...@googlemail.com> on 2011/09/27 16:41:40 UTC

Problem With Entity Listeners

Hi All

I am try to listen for events when an Entity is persisted, updated and
removed. This is simply so that I can update the model which handles the UI.
I have successfully added @EntityListeners(EntryListener.class) anotation to
the entity class. My EntryListener class looks like the following.

public class EntryListener implements EntityListener{

    private PropertyChangeSupport pss = new PropertyChangeSupport(this);
    private EntityNotification en =
Lookup.getDefault().lookup(EntityNotification.class);

    /**
     * Blank no arg constructor
     */
    public EntryListener() {
    }

    @PostPersist
    @Override
    public void postPersist(Object obj) {
        en.postPersist(obj);
    }

    @Override
    public void prePersist(Object obj) {
        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
"prePersist fired");
    }

    @Override
    public void preUpdate(Object obj) {
        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
"preUpdate fired");
    }

    @Override
    public void postUpdate(Object obj) {
        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
"postUpdate fired");
        en.postUpdate(obj);
    }

    @Override
    public void postRemove(Object Obj) {
        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
"postRemove fired");
    }

    @Override
    public void preRemove(Object obj) {
        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
"preRemove fired");
    }

    @Override
    public void addPropertyChangeListener(PropertyChangeListener pcl) {
        pss.addPropertyChangeListener(pcl);
    }

    @Override
    public void removePropertyChangeListener(PropertyChangeListener pcl) {
        pss.removePropertyChangeListener(pcl);
    }

}

The problem is that I seem to be able to catch the event for @postPersist
when a new item is added to the database. I am not closing the EntityManager
each time as a lot of transactions can occur. But am getting the data
straight from the db when updated and then passed to the UI. This works well
for when I add an entry with em.persist. But If I update an item in the UI
and try to either persist the updated item or merge the item no event is
being thrown.

Any advice is much appreciated.

Thanks

David

Re: Problem With Entity Listeners

Posted by David Beer <da...@googlemail.com>.
Hi Jody

Thanks for this I know have the events firing as they should be.

Thanks

David

On 27 September 2011 16:00, Jody Grassel <fy...@gmail.com> wrote:

> Good morning, David.
>
> The @PostPersist callback isn't guaranteed to fire at the moment
> em.persist(entity) or em.merge(newEntity) is called.  What is guaranteed is
> that it will fire when the transaction completes (I think calling
> em.flush()
> will also trigger any pending PostPersist callback invocations as well.)
>
> On the otherhand, @PrePersist is guaranteed to fire when persist() or
> merge(newEntity) is called.  For your situation, you may be better off
> using
> @PrePersist for handling update notifications to your UI.
>
> Now, @PrePersist and @PostPersist fire only when new rows are to be added
> to
> the database.  For modifications of existing rows (such as entities
> acquired
> by em.find() or queries, merging an edited detached entity, or further
> modifications to a still-managed new entity whose row has been committed to
> the database, it is the @PreUpdate and @PostUpdate callbacks are fired.
>
>
> On Tue, Sep 27, 2011 at 9:41 AM, David Beer <david.m.beer@googlemail.com
> >wrote:
>
> > Hi All
> >
> > I am try to listen for events when an Entity is persisted, updated and
> > removed. This is simply so that I can update the model which handles the
> > UI.
> > I have successfully added @EntityListeners(EntryListener.class) anotation
> > to
> > the entity class. My EntryListener class looks like the following.
> >
> > public class EntryListener implements EntityListener{
> >
> >    private PropertyChangeSupport pss = new PropertyChangeSupport(this);
> >    private EntityNotification en =
> > Lookup.getDefault().lookup(EntityNotification.class);
> >
> >    /**
> >     * Blank no arg constructor
> >     */
> >    public EntryListener() {
> >    }
> >
> >    @PostPersist
> >    @Override
> >    public void postPersist(Object obj) {
> >        en.postPersist(obj);
> >    }
> >
> >    @Override
> >    public void prePersist(Object obj) {
> >        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> > "prePersist fired");
> >    }
> >
> >    @Override
> >    public void preUpdate(Object obj) {
> >        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> > "preUpdate fired");
> >    }
> >
> >    @Override
> >    public void postUpdate(Object obj) {
> >        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> > "postUpdate fired");
> >        en.postUpdate(obj);
> >    }
> >
> >    @Override
> >    public void postRemove(Object Obj) {
> >        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> > "postRemove fired");
> >    }
> >
> >    @Override
> >    public void preRemove(Object obj) {
> >        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> > "preRemove fired");
> >    }
> >
> >    @Override
> >    public void addPropertyChangeListener(PropertyChangeListener pcl) {
> >        pss.addPropertyChangeListener(pcl);
> >    }
> >
> >    @Override
> >    public void removePropertyChangeListener(PropertyChangeListener pcl) {
> >        pss.removePropertyChangeListener(pcl);
> >    }
> >
> > }
> >
> > The problem is that I seem to be able to catch the event for @postPersist
> > when a new item is added to the database. I am not closing the
> > EntityManager
> > each time as a lot of transactions can occur. But am getting the data
> > straight from the db when updated and then passed to the UI. This works
> > well
> > for when I add an entry with em.persist. But If I update an item in the
> UI
> > and try to either persist the updated item or merge the item no event is
> > being thrown.
> >
> > Any advice is much appreciated.
> >
> > Thanks
> >
> > David
> >
>

Re: Problem With Entity Listeners

Posted by Jody Grassel <fy...@gmail.com>.
Good morning, David.

The @PostPersist callback isn't guaranteed to fire at the moment
em.persist(entity) or em.merge(newEntity) is called.  What is guaranteed is
that it will fire when the transaction completes (I think calling em.flush()
will also trigger any pending PostPersist callback invocations as well.)

On the otherhand, @PrePersist is guaranteed to fire when persist() or
merge(newEntity) is called.  For your situation, you may be better off using
@PrePersist for handling update notifications to your UI.

Now, @PrePersist and @PostPersist fire only when new rows are to be added to
the database.  For modifications of existing rows (such as entities acquired
by em.find() or queries, merging an edited detached entity, or further
modifications to a still-managed new entity whose row has been committed to
the database, it is the @PreUpdate and @PostUpdate callbacks are fired.


On Tue, Sep 27, 2011 at 9:41 AM, David Beer <da...@googlemail.com>wrote:

> Hi All
>
> I am try to listen for events when an Entity is persisted, updated and
> removed. This is simply so that I can update the model which handles the
> UI.
> I have successfully added @EntityListeners(EntryListener.class) anotation
> to
> the entity class. My EntryListener class looks like the following.
>
> public class EntryListener implements EntityListener{
>
>    private PropertyChangeSupport pss = new PropertyChangeSupport(this);
>    private EntityNotification en =
> Lookup.getDefault().lookup(EntityNotification.class);
>
>    /**
>     * Blank no arg constructor
>     */
>    public EntryListener() {
>    }
>
>    @PostPersist
>    @Override
>    public void postPersist(Object obj) {
>        en.postPersist(obj);
>    }
>
>    @Override
>    public void prePersist(Object obj) {
>        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> "prePersist fired");
>    }
>
>    @Override
>    public void preUpdate(Object obj) {
>        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> "preUpdate fired");
>    }
>
>    @Override
>    public void postUpdate(Object obj) {
>        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> "postUpdate fired");
>        en.postUpdate(obj);
>    }
>
>    @Override
>    public void postRemove(Object Obj) {
>        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> "postRemove fired");
>    }
>
>    @Override
>    public void preRemove(Object obj) {
>        Logger.getLogger(EntryListener.class.getName()).log(Level.INFO,
> "preRemove fired");
>    }
>
>    @Override
>    public void addPropertyChangeListener(PropertyChangeListener pcl) {
>        pss.addPropertyChangeListener(pcl);
>    }
>
>    @Override
>    public void removePropertyChangeListener(PropertyChangeListener pcl) {
>        pss.removePropertyChangeListener(pcl);
>    }
>
> }
>
> The problem is that I seem to be able to catch the event for @postPersist
> when a new item is added to the database. I am not closing the
> EntityManager
> each time as a lot of transactions can occur. But am getting the data
> straight from the db when updated and then passed to the UI. This works
> well
> for when I add an entry with em.persist. But If I update an item in the UI
> and try to either persist the updated item or merge the item no event is
> being thrown.
>
> Any advice is much appreciated.
>
> Thanks
>
> David
>