Skip to content

Cannot use the cross-store plugin in an application that has Entity classes with PrePersist or PreUpdate JPA handler methods [DATAMONGO-519] #1446

@spring-projects-issues

Description

@spring-projects-issues

Manish opened DATAMONGO-519 and commented

Scenario is that we have an application with a large number of JPA-managed entity classes (decorated with @Entity JPA annotation). Many of these classes have JPA event handling methods decorated with JPA annotations such as @PrePersist, @PreUpdate, etc. The underlying

We would like to use the Spring Data MongoDB Cross-Store plugin in this application to persist some part of entity data to MongoDB. However, as soon as we enable the Cross-Store plugin for this application, the Spring application context fails to load with an error like the one below:

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.<init>(SessionFactoryImpl.java:306)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(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)

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 some of the classes already have methods with these annotations, Hibernate Entity Manager fails to validate these classes


Affects: 1.0.2

Referenced from: commits 3b78034

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: declinedA suggestion or change that we don't feel we should currently applytype: bugA general bug

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions