-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 17 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Problem in Entity Manager startup/config
PostPosted: Wed Jan 25, 2006 6:10 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
Further to a discussion in the Hibernate Users folder ( http://forum.hibernate.org/viewtopic.php?t=954382 ), I've been advised to post the question here.

I'm using EJB3/hibernate in JBoss. I have the following line in persistence.xml:

Code:
    <property name="hibernate.ejb.cfgfile" value="hibernate_config.xml"/>


In hibernate_config.xml, I set up event handlers:

Code:
         <event type="pre-update">
            <listener class="com.fcl.util.HibernateEventListener"/>
         </event>
         <event type="post-commit-update">
            <listener class="com.fcl.util.HibernateEventListener"/>
              <listener class="org.hibernate.lucene.event.LuceneEventListener"/>
         </event>
         <event type="post-commit-insert">
            <listener class="com.fcl.util.HibernateEventListener"/>
              <listener class="org.hibernate.lucene.event.LuceneEventListener"/>
         </event>
         <event type="post-commit-delete">
            <listener class="com.fcl.util.HibernateEventListener"/>
              <listener class="org.hibernate.lucene.event.LuceneEventListener"/>
         </event>


(I'm using Lucene to add searchability)

My own code is in com.fcl.util.HibernateEventListener.

The 3 post-whatever events are being fired, and I can see my Lucene indices.

My event listener, the com.fcl.util.HibernateEventListener is not called.

After some investigation, I put debug statements to display a stack trace into

Code:
org.hibernate.event.EventListeners.setPreUpdateEventListeners(PreUpdateEventListener[] preUpdateEventListener)


From this, I discovered that the configuration setup on app deployment is configuring the SessionFactory twice.

Code:
16:54:16,015 INFO  [Configuration] configuring from resource: hibernate_config.xml
16:54:16,015 INFO  [Configuration] Configuration resource: hibernate_config.xml
16:54:16,031 INFO  [STDOUT] java.lang.Exception: Setting PreUpdateEventListeners
16:54:16,031 INFO  [STDOUT]     at org.hibernate.event.EventListeners.setPreUpdateEventListeners(EventListeners.java:418)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.setListeners(Configuration.java:1661)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.setListeners(Configuration.java:1493)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.parseEvent(Configuration.java:1469)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1401)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1363)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1339)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.cfg.Configuration.configure(Configuration.java:1259)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:378)
16:54:16,031 INFO  [STDOUT]     at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:20
2)
16:54:16,062 INFO  [STDOUT]     at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.j
ava:78)
16:54:16,062 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3Deployment.initializeManagedEntityManagerFactory(Ejb3Deployment.java:512)
16:54:16,062 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3Deployment.create(Ejb3Deployment.java:253)
16:54:16,062 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3JmxDeployment.create(Ejb3JmxDeployment.java:230)
16:54:16,062 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3Module.createService(Ejb3Module.java:34)


and then, a few milliseconds later:

Code:
16:54:16,171 INFO  [STDOUT] java.lang.Exception: Setting PreUpdateEventListeners
16:54:16,171 INFO  [STDOUT]     at org.hibernate.event.EventListeners.setPreUpdateEventListeners(EventListeners.java:418)
16:54:16,171 INFO  [STDOUT]     at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:124)
16:54:16,171 INFO  [STDOUT]     at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:473)
16:54:16,171 INFO  [STDOUT]     at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:20
2)
16:54:16,171 INFO  [STDOUT]     at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.j
ava:78)
16:54:16,171 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3Deployment.initializeManagedEntityManagerFactory(Ejb3Deployment.java:512)
16:54:16,171 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3Deployment.create(Ejb3Deployment.java:253)
16:54:16,171 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3JmxDeployment.create(Ejb3JmxDeployment.java:230)
16:54:16,171 INFO  [STDOUT]     at org.jboss.ejb3.Ejb3Module.createService(Ejb3Module.java:34)
16:54:16,171 INFO  [STDOUT]     at org.jboss.system.ServiceMBeanSupport.jbossInternalCreate(ServiceMBeanSupport.java:245)
16:54:16,171 INFO  [STDOUT]     at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:228)
16:54:16,171 INFO  [STDOUT]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
16:54:16,171 INFO  [STDOUT]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
16:54:16,171 INFO  [STDOUT]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
16:54:16,171 INFO  [STDOUT]     at java.lang.reflect.Method.invoke(Method.java:585)
16:54:16,171 INFO  [STDOUT]     at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)
16:54:16,171 INFO  [STDOUT]     at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
16:54:16,171 INFO  [STDOUT]     at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
16:54:16,171 INFO  [STDOUT]     at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:245)
16:54:16,171 INFO  [STDOUT]     at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644)
16:54:16,171 INFO  [STDOUT]     at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:943)


It's configuring once from my XML configuration file, and then it does its own configuration where it sets the pre update listener to be a org.hibernate.validator.event.ValidateEventListener

The problem is that the org.hibernate.event.EventListeners class only has a method for setting the entire stack of listeners. OK, you can get the array, create a new one, copy the old one, add yours, and set it, but the org.hibernate.ejb.EventListenerConfigurator doesn't do that, it just uses what's available and stomps over user-specified listeners.

Surely, like most event handling patterns there should be an addBlahEventListener() call in org.hibernate.event.EventListeners?

Either that or org.hibernate.ejb.EventListenerConfigurator should get the handler array, copy it to a new array, and add it's own listener at the start or end of the array.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 25, 2006 4:09 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
open a JIRa issue please, with the test case and stack trace. There is somehting I don't handle

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 4:59 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
emmanuel wrote:
open a JIRa issue please, with the test case and stack trace. There is somehting I don't handle


How do I do that?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 5:31 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
http://opensource2.atlassian.com/projects/hibernate/secure/Dashboard.jspa
including the minimum source code to reproduce the problem (persistence.xml, hibernate.cfg.xml, event listener and entity. and if possible a junit test case that fails.

_________________
Emmanuel


Top
 Profile  
 
 Post subject: Re: Problem in Entity Manager startup/config
PostPosted: Thu Jan 26, 2006 6:17 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
OK. I've spotted the link and signed up.

http://opensource2.atlassian.com/projec ... se/EJB-116


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 6:20 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
You don't even need an entity, just the initialization files in a .par file.

Obviously, you need the

Code:
    new Exeption("Setting listeners").printStackTrace();


in org.hibernate.event.EventListeners so that you can see the initialization happening.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 31, 2006 9:25 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
OK, here is a new version of org.hibernate.event.EventListeners with addFooEventListener() calls to help in the fixing of this.

It's JDK 5.0 only, is that a problem? Surely most Hibernate users will be up to date?

Code:
//$Id: EventListeners.java,v 1.6 2005/10/16 13:27:54 epbernard Exp $
package org.hibernate.event;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

import org.hibernate.AssertionFailure;
import org.hibernate.MappingException;
import org.hibernate.cfg.Configuration;
import org.hibernate.event.def.DefaultAutoFlushEventListener;
import org.hibernate.event.def.DefaultDeleteEventListener;
import org.hibernate.event.def.DefaultDirtyCheckEventListener;
import org.hibernate.event.def.DefaultEvictEventListener;
import org.hibernate.event.def.DefaultFlushEntityEventListener;
import org.hibernate.event.def.DefaultFlushEventListener;
import org.hibernate.event.def.DefaultInitializeCollectionEventListener;
import org.hibernate.event.def.DefaultLoadEventListener;
import org.hibernate.event.def.DefaultLockEventListener;
import org.hibernate.event.def.DefaultMergeEventListener;
import org.hibernate.event.def.DefaultPersistEventListener;
import org.hibernate.event.def.DefaultPostLoadEventListener;
import org.hibernate.event.def.DefaultPreLoadEventListener;
import org.hibernate.event.def.DefaultRefreshEventListener;
import org.hibernate.event.def.DefaultReplicateEventListener;
import org.hibernate.event.def.DefaultSaveEventListener;
import org.hibernate.event.def.DefaultSaveOrUpdateCopyEventListener;
import org.hibernate.event.def.DefaultSaveOrUpdateEventListener;
import org.hibernate.event.def.DefaultUpdateEventListener;
import org.hibernate.event.def.DefaultPersistOnFlushEventListener;
import org.hibernate.util.Cloneable;

/**
* A convience holder for all defined session event listeners.
*
* @author Steve Ebersole
*/
public class EventListeners extends Cloneable implements Serializable {

   private List<LoadEventListener> loadEventListeners = Arrays.asList((LoadEventListener)new DefaultLoadEventListener());
   private List<SaveOrUpdateEventListener> saveOrUpdateEventListeners = Arrays.asList((SaveOrUpdateEventListener)new DefaultSaveOrUpdateEventListener());
   private List<MergeEventListener> mergeEventListeners = Arrays.asList((MergeEventListener)new DefaultMergeEventListener());
   private List<PersistEventListener> persistEventListeners = Arrays.asList((PersistEventListener)new DefaultPersistEventListener());
   private List<PersistEventListener> persistOnFlushEventListeners = Arrays.asList((PersistEventListener)new DefaultPersistOnFlushEventListener());
   private List<ReplicateEventListener> replicateEventListeners = Arrays.asList((ReplicateEventListener)new DefaultReplicateEventListener());
   private List<DeleteEventListener> deleteEventListeners = Arrays.asList((DeleteEventListener)new DefaultDeleteEventListener());
   private List<AutoFlushEventListener> autoFlushEventListeners = Arrays.asList((AutoFlushEventListener)new DefaultAutoFlushEventListener());
   private List<DirtyCheckEventListener> dirtyCheckEventListeners = Arrays.asList((DirtyCheckEventListener)new DefaultDirtyCheckEventListener());
   private List<FlushEventListener> flushEventListeners = Arrays.asList((FlushEventListener)new DefaultFlushEventListener());
   private List<EvictEventListener> evictEventListeners = Arrays.asList((EvictEventListener)new DefaultEvictEventListener());
   private List<LockEventListener> lockEventListeners = Arrays.asList((LockEventListener)new DefaultLockEventListener());
   private List<RefreshEventListener> refreshEventListeners = Arrays.asList((RefreshEventListener)new DefaultRefreshEventListener());
   private List<FlushEntityEventListener> flushEntityEventListeners = Arrays.asList((FlushEntityEventListener)new DefaultFlushEntityEventListener());
   private List<InitializeCollectionEventListener> initializeCollectionEventListeners =
         Arrays.asList((InitializeCollectionEventListener)new DefaultInitializeCollectionEventListener());

   private List<PostLoadEventListener> postLoadEventListeners = Arrays.asList((PostLoadEventListener)new DefaultPostLoadEventListener());
   private List<PreLoadEventListener> preLoadEventListeners = Arrays.asList((PreLoadEventListener)new DefaultPreLoadEventListener());
   
   private List<PreDeleteEventListener> preDeleteEventListeners = (List<PreDeleteEventListener>)new ArrayList<PreDeleteEventListener>();
   private List<PreUpdateEventListener> preUpdateEventListeners = new ArrayList<PreUpdateEventListener>();
   private List<PreInsertEventListener> preInsertEventListeners = new ArrayList<PreInsertEventListener>();
   private List<PostDeleteEventListener> postDeleteEventListeners = new ArrayList<PostDeleteEventListener>();
   private List<PostUpdateEventListener> postUpdateEventListeners = new ArrayList<PostUpdateEventListener>();
   private List<PostInsertEventListener> postInsertEventListeners = new ArrayList<PostInsertEventListener>();
   private List<PostDeleteEventListener> postCommitDeleteEventListeners = new ArrayList<PostDeleteEventListener>();
   private List<PostUpdateEventListener> postCommitUpdateEventListeners = new ArrayList<PostUpdateEventListener>();
   private List<PostInsertEventListener> postCommitInsertEventListeners = new ArrayList<PostInsertEventListener>();

   private List<SaveOrUpdateEventListener> saveEventListeners = Arrays.asList((SaveOrUpdateEventListener)new DefaultSaveEventListener());
   private List<SaveOrUpdateEventListener> updateEventListeners = Arrays.asList((SaveOrUpdateEventListener)new DefaultUpdateEventListener());
   private List<MergeEventListener> saveOrUpdateCopyEventListeners = Arrays.asList((MergeEventListener)new DefaultSaveOrUpdateCopyEventListener());//saveOrUpdateCopy() is deprecated!

   private static Map<String, Class> eventInterfaceFromType;

   static {
      eventInterfaceFromType = new HashMap<String, Class>();

      eventInterfaceFromType.put("auto-flush", AutoFlushEventListener.class);
      eventInterfaceFromType.put("merge", MergeEventListener.class);
      eventInterfaceFromType.put("create", PersistEventListener.class);
      eventInterfaceFromType.put("create-onflush", PersistEventListener.class);
      eventInterfaceFromType.put("delete", DeleteEventListener.class);
      eventInterfaceFromType.put("dirty-check", DirtyCheckEventListener.class);
      eventInterfaceFromType.put("evict", EvictEventListener.class);
      eventInterfaceFromType.put("flush", FlushEventListener.class);
      eventInterfaceFromType.put("flush-entity", FlushEntityEventListener.class);
      eventInterfaceFromType.put("load", LoadEventListener.class);
      eventInterfaceFromType.put("load-collection", InitializeCollectionEventListener.class);
      eventInterfaceFromType.put("lock", LockEventListener.class);
      eventInterfaceFromType.put("refresh", RefreshEventListener.class);
      eventInterfaceFromType.put("replicate", ReplicateEventListener.class);
      eventInterfaceFromType.put("save-update", SaveOrUpdateEventListener.class);
      eventInterfaceFromType.put("save", SaveOrUpdateEventListener.class);
      eventInterfaceFromType.put("update", SaveOrUpdateEventListener.class);
      eventInterfaceFromType.put("pre-load", PreLoadEventListener.class);
      eventInterfaceFromType.put("pre-update", PreUpdateEventListener.class);
      eventInterfaceFromType.put("pre-delete", PreDeleteEventListener.class);
      eventInterfaceFromType.put("pre-insert", PreInsertEventListener.class);
      eventInterfaceFromType.put("post-load", PostLoadEventListener.class);
      eventInterfaceFromType.put("post-update", PostUpdateEventListener.class);
      eventInterfaceFromType.put("post-delete", PostDeleteEventListener.class);
      eventInterfaceFromType.put("post-insert", PostInsertEventListener.class);
      eventInterfaceFromType.put("post-commit-update", PostUpdateEventListener.class);
      eventInterfaceFromType.put("post-commit-delete", PostDeleteEventListener.class);
      eventInterfaceFromType.put("post-commit-insert", PostInsertEventListener.class);
      eventInterfaceFromType = Collections.unmodifiableMap( eventInterfaceFromType );
   }

   public Class getListenerClassFor(String type) {
      Class clazz = (Class) eventInterfaceFromType.get(type);
      
      if (clazz == null) {
         throw new MappingException("Unrecognized listener type [" + type + "]");
      }

      return clazz;
   }

    public LoadEventListener[] getLoadEventListeners() {
        return (LoadEventListener[])loadEventListeners.toArray();
    }

    public void setLoadEventListeners(LoadEventListener... loadEventListener) {
        this.loadEventListeners = Arrays.asList(loadEventListener);
    }

    public void addLoadEventListeners(LoadEventListener loadEventListener) {
        this.loadEventListeners.add(loadEventListener);
    }

   public ReplicateEventListener[] getReplicateEventListeners() {
      return (ReplicateEventListener[])replicateEventListeners.toArray();
   }

   public void setReplicateEventListeners(ReplicateEventListener... replicateEventListener) {
      this.replicateEventListeners = Arrays.asList(replicateEventListener);
   }

   public void addReplicateEventListener(ReplicateEventListener replicateEventListener) {
      this.replicateEventListeners.add(replicateEventListener);
   }

   public DeleteEventListener[] getDeleteEventListeners() {
      return (DeleteEventListener[])deleteEventListeners.toArray();
   }

   public void setDeleteEventListeners(DeleteEventListener... deleteEventListener) {
      this.deleteEventListeners = Arrays.asList(deleteEventListener);
   }

   public void addDeleteEventListener(DeleteEventListener deleteEventListener) {
      this.deleteEventListeners.add(deleteEventListener);
   }

   public AutoFlushEventListener[] getAutoFlushEventListeners() {
      return (AutoFlushEventListener[])autoFlushEventListeners.toArray();
   }

   public void setAutoFlushEventListeners(AutoFlushEventListener... autoFlushEventListener) {
      this.autoFlushEventListeners = Arrays.asList(autoFlushEventListener);
   }

   public void addAutoFlushEventListener(AutoFlushEventListener autoFlushEventListener) {
      this.autoFlushEventListeners.add(autoFlushEventListener);
   }

   public DirtyCheckEventListener[] getDirtyCheckEventListeners() {
      return (DirtyCheckEventListener[])dirtyCheckEventListeners.toArray();
   }

   public void setDirtyCheckEventListeners(DirtyCheckEventListener... dirtyCheckEventListener) {
      this.dirtyCheckEventListeners = Arrays.asList(dirtyCheckEventListener);
   }

   public void addDirtyCheckEventListener(DirtyCheckEventListener dirtyCheckEventListener) {
      this.dirtyCheckEventListeners.add(dirtyCheckEventListener);
   }

   public FlushEventListener[] getFlushEventListeners() {
      return (FlushEventListener[])flushEventListeners.toArray();
   }

   public void setFlushEventListeners(FlushEventListener... flushEventListener) {
      this.flushEventListeners = Arrays.asList(flushEventListener);
   }

   public void addFlushEventListener(FlushEventListener flushEventListener) {
      this.flushEventListeners.add(flushEventListener);
   }

   public EvictEventListener[] getEvictEventListeners() {
      return (EvictEventListener[])evictEventListeners.toArray();
   }

   public void setEvictEventListeners(EvictEventListener... evictEventListener) {
      this.evictEventListeners = Arrays.asList(evictEventListener);
   }

   public void addEvictEventListener(EvictEventListener evictEventListener) {
      this.evictEventListeners.add(evictEventListener);
   }

   public LockEventListener[] getLockEventListeners() {
      return (LockEventListener[])lockEventListeners.toArray();
   }

   public void setLockEventListeners(LockEventListener... lockEventListener) {
      this.lockEventListeners = Arrays.asList(lockEventListener);
   }

   public void addLockEventListener(LockEventListener lockEventListener) {
      this.lockEventListeners.add(lockEventListener);
   }

   public RefreshEventListener[] getRefreshEventListeners() {
      return (RefreshEventListener[])refreshEventListeners.toArray();
   }

   public void setRefreshEventListeners(RefreshEventListener... refreshEventListener) {
      this.refreshEventListeners = Arrays.asList(refreshEventListener);
   }

   public void addRefreshEventListener(RefreshEventListener refreshEventListener) {
      this.refreshEventListeners.add(refreshEventListener);
   }

   public InitializeCollectionEventListener[] getInitializeCollectionEventListeners() {
      return (InitializeCollectionEventListener[])initializeCollectionEventListeners.toArray();
   }

   public void setInitializeCollectionEventListeners(InitializeCollectionEventListener... initializeCollectionEventListener) {
      this.initializeCollectionEventListeners = Arrays.asList(initializeCollectionEventListener);
   }
   
   public void addInitializeCollectionEventListener(InitializeCollectionEventListener initializeCollectionEventListener) {
      this.initializeCollectionEventListeners.add(initializeCollectionEventListener);
   }
   
   public FlushEntityEventListener[] getFlushEntityEventListeners() {
      return (FlushEntityEventListener[])flushEntityEventListeners.toArray();
   }
   
   public void setFlushEntityEventListeners(FlushEntityEventListener... flushEntityEventListener) {
      this.flushEntityEventListeners = Arrays.asList(flushEntityEventListener);
   }
   
   public void addFlushEntityEventListener(FlushEntityEventListener flushEntityEventListener) {
      this.flushEntityEventListeners.add(flushEntityEventListener);
   }
   
   public SaveOrUpdateEventListener[] getSaveOrUpdateEventListeners() {
      return (SaveOrUpdateEventListener[])saveOrUpdateEventListeners.toArray();
   }
   
   public void setSaveOrUpdateEventListeners(SaveOrUpdateEventListener... saveOrUpdateEventListener) {
      this.saveOrUpdateEventListeners = Arrays.asList(saveOrUpdateEventListener);
   }
   
   public void addSaveOrUpdateEventListener(SaveOrUpdateEventListener saveOrUpdateEventListener) {
      this.saveOrUpdateEventListeners.add(saveOrUpdateEventListener);
   }
   
   public MergeEventListener[] getMergeEventListeners() {
      return (MergeEventListener[])mergeEventListeners.toArray();
   }
   
   public void setMergeEventListeners(MergeEventListener... mergeEventListener) {
      this.mergeEventListeners = Arrays.asList(mergeEventListener);
   }
   
   public void addMergeEventListener(MergeEventListener mergeEventListener) {
      this.mergeEventListeners.add(mergeEventListener);
   }
   
   public PersistEventListener[] getPersistEventListeners() {
      return (PersistEventListener[])persistEventListeners.toArray();
   }
   
   public void setPersistEventListeners(PersistEventListener... createEventListener) {
      this.persistEventListeners = Arrays.asList(createEventListener);
   }

   public void addPersistEventListener(PersistEventListener createEventListener) {
      this.persistEventListeners.add(createEventListener);
   }

   public PersistEventListener[] getPersistOnFlushEventListeners() {
      return (PersistEventListener[])persistOnFlushEventListeners.toArray();
   }

   public void setPersistOnFlushEventListeners(PersistEventListener... createEventListener) {
      this.persistOnFlushEventListeners = Arrays.asList(createEventListener);
   }
   
   public void addPersistOnFlushEventListener(PersistEventListener createEventListener) {
      this.persistOnFlushEventListeners.add(createEventListener);
   }
   
   public MergeEventListener[] getSaveOrUpdateCopyEventListeners() {
      return (MergeEventListener[])saveOrUpdateCopyEventListeners.toArray();
   }
   
   public void setSaveOrUpdateCopyEventListeners(MergeEventListener... saveOrUpdateCopyEventListener) {
      this.saveOrUpdateCopyEventListeners = Arrays.asList(saveOrUpdateCopyEventListener);
   }
   
   public void addSaveOrUpdateCopyEventListener(MergeEventListener saveOrUpdateCopyEventListener) {
      this.saveOrUpdateCopyEventListeners.add(saveOrUpdateCopyEventListener);
   }
   
   public SaveOrUpdateEventListener[] getSaveEventListeners() {
      return (SaveOrUpdateEventListener[])saveEventListeners.toArray();
   }
   
   public void setSaveEventListeners(SaveOrUpdateEventListener... saveEventListener) {
      this.saveEventListeners = Arrays.asList(saveEventListener);
   }
   
   public void addSaveEventListener(SaveOrUpdateEventListener saveEventListener) {
      this.saveEventListeners.add(saveEventListener);
   }
   
   public SaveOrUpdateEventListener[] getUpdateEventListeners() {
      return (SaveOrUpdateEventListener[])updateEventListeners.toArray();
   }
   
   public void setUpdateEventListeners(SaveOrUpdateEventListener... updateEventListener) {
      this.updateEventListeners = Arrays.asList(updateEventListener);
   }

   public void addUpdateEventListener(SaveOrUpdateEventListener updateEventListener) {
      this.updateEventListeners.add(updateEventListener);
   }

   public PostLoadEventListener[] getPostLoadEventListeners() {
      return (PostLoadEventListener[])postLoadEventListeners.toArray();
   }

   public void setPostLoadEventListeners(PostLoadEventListener... postLoadEventListener) {
      this.postLoadEventListeners = Arrays.asList(postLoadEventListener);
   }

   public void addPostLoadEventListener(PostLoadEventListener postLoadEventListener) {
      this.postLoadEventListeners.add(postLoadEventListener);
   }

   public PreLoadEventListener[] getPreLoadEventListeners() {
      return (PreLoadEventListener[])preLoadEventListeners.toArray();
   }

   public void setPreLoadEventListeners(PreLoadEventListener... preLoadEventListener) {
      this.preLoadEventListeners = Arrays.asList(preLoadEventListener);
   }

   public void addPreLoadEventListener(PreLoadEventListener preLoadEventListener) {
      this.preLoadEventListeners.add(preLoadEventListener);
   }

   public PostDeleteEventListener[] getPostDeleteEventListeners() {
      return (PostDeleteEventListener[])postDeleteEventListeners.toArray();
   }
   
   public PostInsertEventListener[] getPostInsertEventListeners() {
      return (PostInsertEventListener[])postInsertEventListeners.toArray();
   }
   
   public PostUpdateEventListener[] getPostUpdateEventListeners() {
      return (PostUpdateEventListener[])postUpdateEventListeners.toArray();
   }
   
   public void setPostDeleteEventListeners(PostDeleteEventListener... postDeleteEventListener) {
      this.postDeleteEventListeners = Arrays.asList(postDeleteEventListener);
   }
   
   public void addPostDeleteEventListener(PostDeleteEventListener postDeleteEventListener) {
      this.postDeleteEventListeners.add(postDeleteEventListener);
   }
   
   public void setPostInsertEventListeners(PostInsertEventListener... postInsertEventListener) {
      this.postInsertEventListeners = Arrays.asList(postInsertEventListener);
   }
   
   public void addPostInsertEventListener(PostInsertEventListener postInsertEventListener) {
      this.postInsertEventListeners.add(postInsertEventListener);
   }
   
   public void setPostUpdateEventListeners(PostUpdateEventListener... postUpdateEventListener) {
      this.postUpdateEventListeners = Arrays.asList(postUpdateEventListener);
   }
   
   public void addPostUpdateEventListener(PostUpdateEventListener postUpdateEventListener) {
      this.postUpdateEventListeners.add(postUpdateEventListener);
   }
   
   public PreDeleteEventListener[] getPreDeleteEventListeners() {
      return (PreDeleteEventListener[])(preDeleteEventListeners.toArray());
   }
   
   public void setPreDeleteEventListeners(PreDeleteEventListener... preDeleteEventListener) {
      this.preDeleteEventListeners = Arrays.asList(preDeleteEventListener);
   }
   
   public void addPreDeleteEventListener(PreDeleteEventListener preDeleteEventListener) {
      this.preDeleteEventListeners.add(preDeleteEventListener);
   }
   
   public PreInsertEventListener[] getPreInsertEventListeners() {
      return (PreInsertEventListener[])preInsertEventListeners.toArray();
   }
   
   public void setPreInsertEventListeners(PreInsertEventListener... preInsertEventListener) {
      this.preInsertEventListeners = Arrays.asList(preInsertEventListener);
   }
   
   public void addPreInsertEventListener(PreInsertEventListener preInsertEventListener) {
      this.preInsertEventListeners.add(preInsertEventListener);
   }
   
   public PreUpdateEventListener[] getPreUpdateEventListeners() {
      return (PreUpdateEventListener[])preUpdateEventListeners.toArray();
   }
   
   public void setPreUpdateEventListeners(PreUpdateEventListener... preUpdateEventListener) {
      this.preUpdateEventListeners = Arrays.asList(preUpdateEventListener);
   }
   
   public void addPreUpdateEventListener(PreUpdateEventListener preUpdateEventListener) {
      this.preUpdateEventListeners.add(preUpdateEventListener);
   }
   
   /**
    * Call <tt>initialize()</tt> on any listeners that implement
    * <tt>Initializable</tt>.
    * @see Initializable
    */
   public void initializeListeners(Configuration cfg) {
      Field[] fields = getClass().getDeclaredFields();
      for ( int i = 0; i < fields.length; i++ ) {
         Object[] listeners;
         try {
            Object listener = fields[i].get(this);
            if (listener instanceof Object[]) {
               listeners = (Object[]) listener;
            }
            else {
               continue;
            }

         }
         catch (Exception e) {
            throw new AssertionFailure("could not init listeners");
         }
         int length = listeners.length;
         for (int index = 0 ; index < length ; index++) {
            Object listener = listeners[index];
            if (listener instanceof Initializable ) {
               ( (Initializable) listener ).initialize(cfg);
            }
         }

      }
   }

   public PostDeleteEventListener[] getPostCommitDeleteEventListeners() {
      return (PostDeleteEventListener[])postCommitDeleteEventListeners.toArray();
   }

   public void setPostCommitDeleteEventListeners(
         PostDeleteEventListener... postCommitDeleteEventListeners) {
      this.postCommitDeleteEventListeners = Arrays.asList(postCommitDeleteEventListeners);
   }

   public void addPostCommitDeleteEventListener(
         PostDeleteEventListener postCommitDeleteEventListeners) {
      this.postCommitDeleteEventListeners.add(postCommitDeleteEventListeners);
   }

   public PostInsertEventListener[] getPostCommitInsertEventListeners() {
      return (PostInsertEventListener[])postCommitInsertEventListeners.toArray();
   }

   public void setPostCommitInsertEventListeners(
         PostInsertEventListener... postCommitInsertEventListeners) {
      this.postCommitInsertEventListeners = Arrays.asList(postCommitInsertEventListeners);
   }

   public void addPostCommitInsertEventListener(
         PostInsertEventListener postCommitInsertEventListeners) {
      this.postCommitInsertEventListeners.add(postCommitInsertEventListeners);
   }

   public PostUpdateEventListener[] getPostCommitUpdateEventListeners() {
      return (PostUpdateEventListener[])postCommitUpdateEventListeners.toArray();
   }

   public void setPostCommitUpdateEventListeners(
         PostUpdateEventListener... postCommitUpdateEventListeners) {
      this.postCommitUpdateEventListeners = Arrays.asList(postCommitUpdateEventListeners);
   }

   public void addPostCommitUpdateEventListener(
         PostUpdateEventListener postCommitUpdateEventListeners) {
      this.postCommitUpdateEventListeners.add(postCommitUpdateEventListeners);
   }

}


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 31, 2006 10:33 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
so org.hibernate.ejb.EventListenerConfigurator becomes

Code:
//$Id: EventListenerConfigurator.java,v 1.7 2006/01/03 15:52:30 epbernard Exp $
package org.hibernate.ejb;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import org.hibernate.HibernateException;
import org.hibernate.ejb.event.CallbackHandlerConsumer;
import org.hibernate.ejb.event.EJB3DeleteEventListener;
import org.hibernate.ejb.event.EJB3FlushEntityEventListener;
import org.hibernate.ejb.event.EJB3MergeEventListener;
import org.hibernate.ejb.event.EJB3PersistEventListener;
import org.hibernate.ejb.event.EJB3PostDeleteEventListener;
import org.hibernate.ejb.event.EJB3PostInsertEventListener;
import org.hibernate.ejb.event.EJB3PostLoadEventListener;
import org.hibernate.ejb.event.EJB3PostUpdateEventListener;
import org.hibernate.ejb.event.EJB3SaveEventListener;
import org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener;
import org.hibernate.ejb.event.EntityCallbackHandler;
import org.hibernate.ejb.event.EJB3AutoFlushEventListener;
import org.hibernate.ejb.event.EJB3FlushEventListener;
import org.hibernate.ejb.event.EJB3PersistOnFlushEventListener;
import org.hibernate.event.AutoFlushEventListener;
import org.hibernate.event.DeleteEventListener;
import org.hibernate.event.EventListeners;
import org.hibernate.event.FlushEntityEventListener;
import org.hibernate.event.FlushEventListener;
import org.hibernate.event.MergeEventListener;
import org.hibernate.event.PersistEventListener;
import org.hibernate.event.PostDeleteEventListener;
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.event.PostLoadEventListener;
import org.hibernate.event.PostUpdateEventListener;
import org.hibernate.event.PreDeleteEventListener;
import org.hibernate.event.PreInsertEventListener;
import org.hibernate.event.PreLoadEventListener;
import org.hibernate.event.PreUpdateEventListener;
import org.hibernate.event.SaveOrUpdateEventListener;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.secure.JACCPreDeleteEventListener;
import org.hibernate.secure.JACCPreInsertEventListener;
import org.hibernate.secure.JACCPreLoadEventListener;
import org.hibernate.secure.JACCPreUpdateEventListener;
import org.hibernate.secure.JACCSecurityListener;
import org.hibernate.validator.event.ValidateEventListener;

/**
* @author Emmanuel Bernard
*/
public class EventListenerConfigurator {
   private static final Object[] READER_METHOD_ARGS = new Object[0];

   private Properties properties;
   private Ejb3Configuration configuration;
   private boolean isValidator;
   private boolean isSecurity;
   private String jaccContextID;

   public EventListenerConfigurator(Ejb3Configuration configuration) {
      this.configuration = configuration;
      ValidateEventListener validateEventListener = new ValidateEventListener();
      EventListeners listenerConfig = configuration.getEventListeners();

      //Action event
      //EJB3-specific ops listeners
      listenerConfig.addFlushEventListeners( EJB3FlushEventListener.INSTANCE );
      //EJB3-specific ops listeners
      listenerConfig.addAutoFlushEventListener( EJB3AutoFlushEventListener.INSTANCE );
      listenerConfig.addDeleteEventListener( new EJB3DeleteEventListener() );
      listenerConfig.addFlushEntityEventListener( new EJB3FlushEntityEventListener() );
      listenerConfig.addMergeEventListener( new EJB3MergeEventListener() );
      listenerConfig.addPersistEventListener( new EJB3PersistEventListener() );
      listenerConfig.addPersistOnFlushEventListener( new EJB3PersistOnFlushEventListener() );
      listenerConfig.addSaveEventListener( new EJB3SaveEventListener() );
      listenerConfig.addSaveOrUpdateEventListener( new EJB3SaveOrUpdateEventListener() );

      //Pre events
      listenerConfig.addPreInsertEventListener(
                  new JACCPreInsertEventListener(),
                  validateEventListener
      );
      listenerConfig.addPreUpdateEventListener(
                  new JACCPreUpdateEventListener(),
                  validateEventListener
      );
      listenerConfig.addPreDeleteEventListener(
                  new JACCPreDeleteEventListener()
      );
      listenerConfig.addPreLoadEventListener(
                  new JACCPreLoadEventListener()
      );

      //post events
      listenerConfig.addPostDeleteEventListener(
            new EJB3PostDeleteEventListener()
      );
      listenerConfig.addPostInsertEventListener(
            new EJB3PostInsertEventListener()
      );
      listenerConfig.addPostLoadEventListener(
            new EJB3PostLoadEventListener()
      );
      listenerConfig.addPostUpdateEventListener(
            new EJB3PostUpdateEventListener()
      );
   }

   public void setValidator(boolean validator) {
      isValidator = validator;
   }

   public void setProperties(Properties properties) {
      this.properties = properties;
      if ( properties.containsKey( HibernatePersistence.JACC_ENABLED ) ) {
         isSecurity = true;
      }
      if ( properties.containsKey( HibernatePersistence.JACC_CONTEXT_ID ) ) {
         jaccContextID = properties.getProperty( HibernatePersistence.JACC_CONTEXT_ID );
      }
      //override events if needed
      Enumeration<?> enumeration = properties.propertyNames();
      while ( enumeration.hasMoreElements() ) {
         String name = (String) enumeration.nextElement();
         if ( name.startsWith( HibernatePersistence.EVENT_LISTENER_PREFIX ) ) {
            String type = name.substring( HibernatePersistence.EVENT_LISTENER_PREFIX.length() + 1 );
            StringTokenizer st = new StringTokenizer( properties.getProperty( name ), " ,", false );
            List<String> listeners = new ArrayList<String>();
            while ( st.hasMoreElements() ) {
               listeners.add( (String) st.nextElement() );
            }
            configuration.setListeners( type, listeners.toArray( new String[ listeners.size() ] ) );
         }
      }
      ;
   }

   public void configure() {
      //TODO exclude pure hbm file classes?
      //TODO move it to each event listener initialize()?
      EntityCallbackHandler callbackHandler = new EntityCallbackHandler();
      configuration.buildMappings(); //needed to get all the classes
      Iterator classes = configuration.getClassMappings();
      while ( classes.hasNext() ) {
         PersistentClass clazz = (PersistentClass) classes.next();
         callbackHandler.add( clazz.getMappedClass() );
      }

      EventListeners listenerConfig = configuration.getEventListeners();

      BeanInfo beanInfo = null;
      try {
         beanInfo = Introspector.getBeanInfo( listenerConfig.getClass(), Object.class );
         PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
         try {
            for ( int i = 0, max = pds.length; i < max ; i++ ) {
               final Object listeners = pds[i].getReadMethod().invoke( listenerConfig, READER_METHOD_ARGS );
               if ( listeners == null ) {
                  throw new HibernateException( "Listener [" + pds[i].getName() + "] was null" );
               }
               if ( listeners instanceof Object[] ) {
                  int securityListenersNbr = 0;
                  Object[] listenersArray = (Object[]) listeners;
                  for ( Object listener : listenersArray ) {
                     if ( listener != null && listener instanceof CallbackHandlerConsumer ) {
                        ( (CallbackHandlerConsumer) listener ).setCallbackHandler( callbackHandler );
                     }
                     if ( listener != null && listener instanceof JACCSecurityListener ) {
                        if ( !isSecurity ) {
                           securityListenersNbr++;
                        }
                     }
                  }
                  if ( !isSecurity ) {
                     Class clazz = pds[i].getReadMethod().getReturnType().getComponentType();
                     Object newArray = Array.newInstance( clazz, listenersArray.length - securityListenersNbr );
                     int index = 0;
                     for ( Object listener : listenersArray ) {
                        if ( ! ( listener != null && listener instanceof JACCSecurityListener ) ) {
                           Array.set( newArray, index++, listener );
                        }
                     }
                     pds[i].getWriteMethod().invoke( listenerConfig, newArray );
                  }
               }
            }
         }
         catch (HibernateException e) {
            throw e;
         }
         catch (Throwable t) {
            throw new HibernateException( "Unable to validate listener config", t );
         }
      }
      catch (Exception t) {
         throw new HibernateException( "Unable to copy listeners", t );
      }
      finally {
         if ( beanInfo != null ) {
            // release the jdk internal caches everytime to ensure this
            // plays nicely with destroyable class-loaders
            Introspector.flushFromCaches( getClass() );
         }
      }
   }
}


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 21, 2006 10:06 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
I notice only one vote for this issue on

http://opensource2.atlassian.com/projec ... se/EJB-116

I think this is quite serious. You cannot add your own pre-update event listener.

This is going to become a show stopper for us soon. We are planning to implement our own security layer which will check updates of the database.

So we need our own pre-update listener NOT to be overridden by Hiberrnate's listeners.

They need to stack, not override.

Is anything going to be done about this?


Top
 Profile  
 
 Post subject:
PostPosted: Sat Mar 25, 2006 9:13 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
I didn't see the patch when I cut HEM beta7, sorry :-(
I've marked it to be fixed for beta8

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Mon Mar 27, 2006 6:22 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
Thanks. (BTW, the code I posted is buggy, and just a "suggestion"!)

I still need some help with the programmatic configuration though.

It looks like what I really want is Interceptors, for my security checks (and updates of date/user last updated), not pre-xxx events, as described in the manual's "Chapter 12. Interceptors and events".

But since I'm inside JBoss, I don't get to create the Configuration, and set the interceptors.

For post event auditing of what's happened, post-commit-xxx events are probably the best.

I thought they only got fired after the update is comitted. I seem to be getting the event for every field in the entity that's changed when the setter is called! So when updating an entity from a submitted HTML form, all the setters are called, and I get loads of notifications! Why is this?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Mar 27, 2006 6:56 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
use hibernate.ejb.interceptor to define an interceptor in HEM

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Mon Mar 27, 2006 8:51 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
I don't understand.

What's a hibernate.ejb.interceptor? I can't find any reference to that class in the org.hibernate.ejb API docs.

"HEM" what's that?


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 28, 2006 4:49 am 
Newbie

Joined: Tue Mar 07, 2006 7:20 am
Posts: 16
My guess:

HEM = Hibernate EntityManager (the EJB3 interface to access Hibernate) see http://entitymanager.hibernate.org/


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 28, 2006 5:38 am 
Regular
Regular

Joined: Fri Jan 20, 2006 9:38 am
Posts: 61
Location: Notts, UK
OK, HEM = Hibernate Entity Manager.

But how do I start it up within JBoss, and NOT have JBoss do its own startup, but still have HEM scan the jar for annotated entity classes?

Something to do with org.hibernate.ejb.Ejb3Configuration?

The only method of that which calls Ejb3Configuration.scanForClasses() is

Code:
   public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info)


Where do I get a PersistenceUnitInfo from?


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 17 posts ]  Go to page 1, 2  Next

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.