title: Spring Data MongoDB Cross-Store plugin and JPA PrePersist and PreUpdate
body: <p>We have an application with the following set up:</p>
  
  <p>Java 6.0
  Spring Data JPA 1.1.0.RELEASE
  Spring Data MongoDB 1.0.2.RELEASE
  Spring Data MongoDB Cross-Store 1.0.2.RELEASE
  Hibernate JPA 2.0</p>
  
  <p>We have several classes in this application that use the JPA PrePersist, PreUpdate, PostPersist and PostUpdate annotations. An example is given below.</p>
  
  <pre><code>@Entity
  public class Person
  {
      private String password;
  
      @PrePersist
      @PreUpdate
      public void beforeSave()
      {
          if(!Security.isEncrypted(this.password))
          {
              this.password = Security.encrypt(this.password);
          }
      }
  }
  </code></pre>
  
  <p>As soon as we turn on AspectJ weaving for the cross-store plugin, the Spring application context fails to load with the error:</p>
  
  <pre><code>Caused by: javax.persistence.PersistenceException: You can only annotate one callback method with javax.persistence.PrePersist in bean class: org.example.domain.Person
      at org.hibernate.ejb.event.CallbackResolver.resolveCallback(CallbackResolver.java:110)
      at org.hibernate.ejb.event.EntityCallbackHandler.addCallback(EntityCallbackHandler.java:123)
      at org.hibernate.ejb.event.EntityCallbackHandler.add(EntityCallbackHandler.java:61)
      at org.hibernate.ejb.event.JpaIntegrator.integrate(JpaIntegrator.java:151)
      at org.hibernate.internal.SessionFactoryImpl.&lt;init&gt;(SessionFactoryImpl.java:306)
      at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
      at org.hibernate.ejb.EntityManagerFactoryImpl.&lt;init&gt;(EntityManagerFactoryImpl.java:94)
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
      at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
      at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)
      at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
  </code></pre>
  
  <p>I have found out that the root cause for the error is that the Aspect MongoDocumentBacking weaves additional PrePersist and PreUpdate methods into entity classes. Since the classes already have methods with these annotations, Hibernate Entity Manager fails to validate these classes.</p>
  
  <p>Is there any guidance on how the cross-store plugin should be used with applications that have existing code that use JPA annotations?</p>