title: Hibernate/JPA - Entity listener not being called properly
body: <p>I'm trying to leverage EntityListener objects and callback methods within my Seam/Hibernate/JPA application.  I'm using a Seam 2.2-managed persistence context on JBoss 5.1 with PostgreSQL 9.1 on the backend.  I have the following entity declared:</p>
  
  <pre><code>@Entity(name = "TestEntity")
  @EntityListeners(TestCallback.class)
  @Table(name = "tbl_test")
  public class TestEntity implements Serializable {
  
      private static final long serialVersionUID = 2016897066783042092L;
  
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "xxx")
      @SequenceGenerator(name = "xxx", sequenceName = "xxx")
      @Index(name = "xxx")
      @DocumentId
      private Long id = null;
  
      @Column
      private String test = null;
  ...
  }
  </code></pre>
  
  <p>along with the following EntityListener callback class:</p>
  
  <pre><code>public class TestCallback {
  
      /**
       * Logger for this class
       */
      private Log logger = null;
  
      public TestCallback() {
          logger = Logging.getLog(TestCallback.class);
      }
  
      @PrePersist
      public void prePersist(TestEntity e) {
          logger.debug("prePersist(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("prePersist(TestEntity) - end"); //$NON-NLS-1$
      }
  
      @PostPersist
      public void postPersist(TestEntity e) {
          logger.debug("postPersist(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("postPersist(TestEntity) - end"); //$NON-NLS-1$
      }
  
      @PostLoad
      public void postLoad(TestEntity e) {
          logger.debug("postLoad(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("postLoad(TestEntity) - end"); //$NON-NLS-1$
      }
  
      @PreUpdate
      public void preUpdate(TestEntity e) {
          logger.debug("preUpdate(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("preUpdate(TestEntity) - end"); //$NON-NLS-1$
      }
  
      @PostUpdate
      public void postUpdate(TestEntity e) {
          logger.debug("postUpdate(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("postUpdate(TestEntity) - end"); //$NON-NLS-1$
      }
  
      @PreRemove
      public void preRemove(TestEntity e) {
          logger.debug("preRemove(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("preRemove(TestEntity) - end"); //$NON-NLS-1$
      }
  
      @PostRemove
      public void postRemove(TestEntity e) {
          logger.debug("postRemove(TestEntity) - start"); //$NON-NLS-1$
  
          logger.debug("postRemove(TestEntity) - end"); //$NON-NLS-1$
      }
  }
  </code></pre>
  
  <p>When I run my test, however, I do not see all of my callback methods being called as I would expect.  I've run tests of the following scenarios:</p>
  
  <ul>
  <li>Persisting a new item</li>
  <li>Updating an existing item</li>
  <li>Loading an item</li>
  <li>Deleting an item</li>
  </ul>
  
  <p>However, the only callbacks I see being called are:</p>
  
  <ul>
  <li><code>@PrePersist</code></li>
  <li><code>@PreRemove</code></li>
  <li><code>@PostLoad</code></li>
  <li><code>@PreUpdate</code></li>
  </ul>
  
  <p>The remaining callbacks do not get executed as expected.  Is this the normal behavior?  Am I just misunderstanding it?  Does this have something to do with the way Seam manages transactions?  Or, am I just not doing something right?</p>
  
  <p>I'd appreciate any help you can give.</p>
  
  <p><strong>EDIT:</strong>  As requested, here is the exact code I'm calling and the output I receive:</p>
  
  <p>Test 1:</p>
  
  <pre><code>public void runTest() {
      logger.debug("runTest() - start"); //$NON-NLS-1$
  
      TestEntity e = new TestEntity();
      e.setTest("XXX");
  
      this.entityManager.persist(e);
      this.entityManager.flush();
      this.entityManager.clear();
  
      logger.debug("runTest() - end"); //$NON-NLS-1$
  }
  </code></pre>
  
  <p>Output 1:</p>
  
  <pre><code>12:27:56,307 INFO  [STDOUT] 29735 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest() - start
  12:27:56,312 INFO  [STDOUT] 29740 DEBUG myapp.test.entities.TestCallback  -  - prePersist(TestEntity) - start
  12:27:56,312 INFO  [STDOUT] 29740 DEBUG myapp.test.entities.TestCallback  -  - prePersist(TestEntity) - end
  12:27:56,347 INFO  [STDOUT] 29775 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest() - end
  </code></pre>
  
  <p>Test 2:</p>
  
  <pre><code>public void runTest2() {
          logger.debug("runTest2() - start"); //$NON-NLS-1$
  
          String sql = "SELECT DISTINCT t FROM TestEntity t";
          Query q = this.entityManager.createQuery(sql);
  
          List&lt;TestEntity&gt; l = q.getResultList();
          for (int i = 0; i &lt; l.size(); i++) {
              String x = l.get(i).getTest();
              logger.debug("runTest2() - String x=" + x); //$NON-NLS-1$
          }
  
          logger.debug("runTest2() - end"); //$NON-NLS-1$
      }
  </code></pre>
  
  <p>Output 2:</p>
  
  <pre><code>12:28:36,964 INFO  [STDOUT] 70392 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest2() - start
  12:28:36,982 INFO  [STDOUT] 70410 DEBUG myapp.test.entities.TestCallback  -  - postLoad(TestEntity) - start
  12:28:36,982 INFO  [STDOUT] 70410 DEBUG myapp.test.entities.TestCallback  -  - postLoad(TestEntity) - end
  12:28:36,982 INFO  [STDOUT] 70410 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest2() - String x=XXX
  12:28:36,983 INFO  [STDOUT] 70411 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest2() - end
  </code></pre>
  
  <p>Test 3:</p>
  
  <pre><code>public void runTest3() {
          logger.debug("runTest3() - start"); //$NON-NLS-1$
  
          String sql = "SELECT DISTINCT t FROM TestEntity t";
          Query q = this.entityManager.createQuery(sql);
  
          List&lt;TestEntity&gt; l = q.getResultList();
          for (int i = 0; i &lt; l.size(); i++) {
              l.get(i).setTest("YYY" + System.currentTimeMillis());
              this.entityManager.persist(l.get(i));
          }
          this.entityManager.flush();
          this.entityManager.clear();
  
          Random rand = new SecureRandom();
  
          q = this.entityManager.createQuery(sql);
          l = q.getResultList();
          for (int i = 0; i &lt; l.size(); i++) {
              this.entityManager.remove(l.get(i));
          }
  
          this.entityManager.flush();
          this.entityManager.clear();
  
          logger.debug("runTest3() - end"); //$NON-NLS-1$
      }
  </code></pre>
  
  <p>Output 3:</p>
  
  <pre><code>12:30:00,404 INFO  [STDOUT] 153832 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest3() - start
  12:30:00,407 INFO  [STDOUT] 153835 DEBUG myapp.test.entities.TestCallback  -  - postLoad(TestEntity) - start
  12:30:00,407 INFO  [STDOUT] 153835 DEBUG myapp.test.entities.TestCallback  -  - postLoad(TestEntity) - end
  12:30:00,408 INFO  [STDOUT] 153836 DEBUG myapp.test.entities.TestCallback  -  - preUpdate(TestEntity) - start
  12:30:00,408 INFO  [STDOUT] 153836 DEBUG myapp.test.entities.TestCallback  -  - preUpdate(TestEntity) - end
  12:30:00,410 INFO  [STDOUT] 153838 DEBUG myapp.test.entities.TestCallback  -  - postLoad(TestEntity) - start
  12:30:00,411 INFO  [STDOUT] 153839 DEBUG myapp.test.entities.TestCallback  -  - postLoad(TestEntity) - end
  12:30:00,414 INFO  [STDOUT] 153842 DEBUG myapp.test.entities.TestCallback  -  - preRemove(TestEntity) - start
  12:30:00,414 INFO  [STDOUT] 153842 DEBUG myapp.test.entities.TestCallback  -  - preRemove(TestEntity) - end
  12:30:00,453 INFO  [STDOUT] 153881 DEBUG myapp.test.web.actions.test.TestAction  -  - runTest3() - end
  </code></pre>