java - Spring's @EntityListeners is throwing an exception when using @Postpersist -


i have small test application testing @entitylisteners functionality. when run application following stacktrace

exception in thread "main" org.springframework.transaction.transactionsystemexception: not commit jpa transaction; nested exception javax.persistence.rollbackexception: error while committing transaction     @ org.springframework.orm.jpa.jpatransactionmanager.docommit(jpatransactionmanager.java:526)     @ org.springframework.transaction.support.abstractplatformtransactionmanager.processcommit(abstractplatformtransactionmanager.java:761)     @ org.springframework.transaction.support.abstractplatformtransactionmanager.commit(abstractplatformtransactionmanager.java:730)     @ org.springframework.transaction.interceptor.transactionaspectsupport.committransactionafterreturning(transactionaspectsupport.java:504)     @ org.springframework.transaction.interceptor.transactionaspectsupport.invokewithintransaction(transactionaspectsupport.java:292)     @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:96)     @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179)     @ org.springframework.dao.support.persistenceexceptiontranslationinterceptor.invoke(persistenceexceptiontranslationinterceptor.java:136)     @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179)     @ org.springframework.data.jpa.repository.support.crudmethodmetadatapostprocessor$crudmethodmetadatapopulatingmethodinterceptor.invoke(crudmethodmetadatapostprocessor.java:133)     @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179)     @ org.springframework.aop.interceptor.exposeinvocationinterceptor.invoke(exposeinvocationinterceptor.java:92)     @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179)     @ org.springframework.data.repository.core.support.surroundingtransactiondetectormethodinterceptor.invoke(surroundingtransactiondetectormethodinterceptor.java:57)     @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179)     @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:213)     @ com.sun.proxy.$proxy67.save(unknown source)     @ com.example.hibernate_envers_test.hibernateenverstestapplication.main(hibernateenverstestapplication.java:32) caused by: javax.persistence.rollbackexception: error while committing transaction     @ org.hibernate.jpa.internal.transactionimpl.commit(transactionimpl.java:87)     @ org.springframework.orm.jpa.jpatransactionmanager.docommit(jpatransactionmanager.java:517)     ... 17 more caused by: java.lang.nullpointerexception     @ com.example.hibernate_envers_test.accountlistener.crudlogger(accountlistener.java:38)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:498)     @ org.hibernate.jpa.event.internal.jpa.listenercallback.performcallback(listenercallback.java:35)     @ org.hibernate.jpa.event.internal.jpa.callbackregistryimpl.callback(callbackregistryimpl.java:94)     @ org.hibernate.jpa.event.internal.jpa.callbackregistryimpl.postcreate(callbackregistryimpl.java:63)     @ org.hibernate.jpa.event.internal.core.jpapostinserteventlistener.onpostinsert(jpapostinserteventlistener.java:38)     @ org.hibernate.action.internal.entityinsertaction.postinsert(entityinsertaction.java:164)     @ org.hibernate.action.internal.entityinsertaction.execute(entityinsertaction.java:131)     @ org.hibernate.engine.spi.actionqueue.executeactions(actionqueue.java:582)     @ org.hibernate.engine.spi.actionqueue.executeactions(actionqueue.java:456)     @ org.hibernate.event.internal.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:337)     @ org.hibernate.event.internal.defaultflusheventlistener.onflush(defaultflusheventlistener.java:39)     @ org.hibernate.internal.sessionimpl.flush(sessionimpl.java:1282)     @ org.hibernate.internal.sessionimpl.managedflush(sessionimpl.java:465)     @ org.hibernate.internal.sessionimpl.flushbeforetransactioncompletion(sessionimpl.java:2963)     @ org.hibernate.internal.sessionimpl.beforetransactioncompletion(sessionimpl.java:2339)     @ org.hibernate.engine.jdbc.internal.jdbccoordinatorimpl.beforetransactioncompletion(jdbccoordinatorimpl.java:485)     @ org.hibernate.resource.transaction.backend.jdbc.internal.jdbcresourcelocaltransactioncoordinatorimpl.beforecompletioncallback(jdbcresourcelocaltransactioncoordinatorimpl.java:147)     @ org.hibernate.resource.transaction.backend.jdbc.internal.jdbcresourcelocaltransactioncoordinatorimpl.access$100(jdbcresourcelocaltransactioncoordinatorimpl.java:38)     @ org.hibernate.resource.transaction.backend.jdbc.internal.jdbcresourcelocaltransactioncoordinatorimpl$transactiondrivercontrolimpl.commit(jdbcresourcelocaltransactioncoordinatorimpl.java:231)     @ org.hibernate.engine.transaction.internal.transactionimpl.commit(transactionimpl.java:65)     @ org.hibernate.jpa.internal.transactionimpl.commit(transactionimpl.java:61)     ... 18 more 

as can see complains not being able commit jpa transaction. followed nullpointer exception whenever try use accounthistoryrepo spring jpa repository interface. have checked whether account pojo argument or repository instance null, wasn't case. when replace @postpersist @prepersist transactionsystemexception no longer appears still have mysterious nullpointer exception deal with. next prefer use postpersist because don't want persist history object when actual object on history object based wasn't persisted correctly. can me? below code of test application:

accountlistener

/*  * change license header, choose license headers in project properties.  * change template file, choose tools | templates  * , open template in editor.  */ package com.example.hibernate_envers_test;  import com.example.pojo.account; import com.example.pojo.accounthistory; import javax.persistence.postpersist; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.component;  /**  *  * @author maurice  */ @component public class accountlistener {      @autowired     accounthistoryrepo accounthistoryrepo;       @postpersist     public void crudlogger(account account){         system.out.println("is account null?: " + account == null);                 system.out.println("is account null?: " + account.getjabberid());         system.out.println("is accounthistoryrrepo null?: " + accounthistoryrepo);         if (accounthistoryrepo.count()>=10) accounthistoryrepo.deleteoldestentry();         accounthistoryrepo.save(new accounthistory(account));     }  } 

account pojo

@entity @entitylisteners(accountlistener.class) public class account implements serializable {      @id     @generatedvalue(generator = "id_generator")     private long accountid;      private string name;      private boolean isenabled;      private boolean issmartsuppenabled;      private string jabberid;      private double budgetwarningpercentage;      private boolean issentbudgetwarning;      private double budgetamount;      private int departmentlevel;      private int contactid;      public long getaccountid() {         return accountid;     }      public account setaccountid(long accountid) {         this.accountid = accountid;         return this;     }      public string getname() {         return name;     }      public account setname(string name) {         this.name = name;         return this;     }      public boolean isisenabled() {         return isenabled;     }      public account setisenabled(boolean isenabled) {         this.isenabled = isenabled;         return this;     }      public boolean isissmartsuppenabled() {         return issmartsuppenabled;     }      public account setissmartsuppenabled(boolean issmartsuppenabled) {         this.issmartsuppenabled = issmartsuppenabled;         return this;     }      public string getjabberid() {         return jabberid;     }      public account setjabberid(string jabberid) {         this.jabberid = jabberid;         return this;     }      public double getbudgetwarningpercentage() {         return budgetwarningpercentage;     }      public account setbudgetwarningpercentage(double budgetwarningpercentage) {         this.budgetwarningpercentage = budgetwarningpercentage;         return this;     }      public boolean isissentbudgetwarning() {         return issentbudgetwarning;     }      public account setissentbudgetwarning(boolean issentbudgetwarning) {         this.issentbudgetwarning = issentbudgetwarning;         return this;     }      public double getbudgetamount() {         return budgetamount;     } 

accounthistory pojo

@entity(name = "account_history") public class accounthistory implements serializable {     @id     @generatedvalue(generator = "id_generator")     private long accounthistoryid;      private long accountid;      private string name;      private boolean isenabled;      private boolean issmartsuppenabled;      private string jabberid;      private double budgetwarningpercentage;      private boolean issentbudgetwarning;      private double budgetamount;      private int departmentlevel;      private int contactid;      public accounthistory(){}      public accounthistory(account account){         this.accountid = account.getaccountid();         this.name = account.getname();         this.isenabled = account.isisenabled();         this.issmartsuppenabled  = account.isissmartsuppenabled();         this.jabberid = account.getjabberid();         this.budgetwarningpercentage = account.getbudgetwarningpercentage();         this.issentbudgetwarning = account.isissentbudgetwarning();         this.budgetamount = account.getbudgetamount();         this.departmentlevel = account.getdepartmentlevel();         this.contactid = account.getcontactid();         }      public long getaccountid() {         return accountid;     }      public accounthistory setaccountid(long accountid) {         this.accountid = accountid;         return this;     }      public string getname() {         return name;     }      public accounthistory setname(string name) {         this.name = name;         return this;     }      public boolean isisenabled() {         return isenabled;     }      public accounthistory setisenabled(boolean isenabled) {         this.isenabled = isenabled;         return this;     }      public boolean isissmartsuppenabled() {         return issmartsuppenabled;     }      public accounthistory setissmartsuppenabled(boolean issmartsuppenabled) {         this.issmartsuppenabled = issmartsuppenabled;         return this;     }      public string getjabberid() {         return jabberid;     }      public accounthistory setjabberid(string jabberid) {         this.jabberid = jabberid;         return this;     }      public double getbudgetwarningpercentage() {         return budgetwarningpercentage;     }      public accounthistory setbudgetwarningpercentage(double budgetwarningpercentage) {         this.budgetwarningpercentage = budgetwarningpercentage;         return this;     }      public boolean isissentbudgetwarning() {         return issentbudgetwarning;     }      public accounthistory setissentbudgetwarning(boolean issentbudgetwarning) {         this.issentbudgetwarning = issentbudgetwarning;         return this;     }      public double getbudgetamount() {         return budgetamount;     }      public accounthistory setbudgetamount(double budgetamount) {         this.budgetamount = budgetamount;         return this;     }      public int getdepartmentlevel() {         return departmentlevel;     }      public accounthistory setdepartmentlevel(int departmentlevel) {         this.departmentlevel = departmentlevel;         return this;     }      public int getcontactid() {         return contactid;     }      public accounthistory setcontactid(int contactid) {         this.contactid = contactid;         return this;     } }        public account setbudgetamount(double budgetamount) {         this.budgetamount = budgetamount;         return this;     }      public int getdepartmentlevel() {         return departmentlevel;     }      public account setdepartmentlevel(int departmentlevel) {         this.departmentlevel = departmentlevel;         return this;     }      public int getcontactid() {         return contactid;     }      public account setcontactid(int contactid) {         this.contactid = contactid;         return this;     } } 

accounthistoryrepo

@repository public interface accounthistoryrepo extends jparepository<accounthistory,long> {     @query("delete account_history p p.accounthistoryid = (select min(p.accounthistoryid) account_history p)")     public void deleteoldestentry(); } 

accountrepo

@repository public interface accountrepository extends jparepository<account,long> {  } 

main class

@springbootapplication public class hibernateenverstestapplication implements applicationcontextaware  {      private static applicationcontext ac;  //    @autowired //    accountrepository accountrepo;     public static void main(string[] args) {         springapplication.run(hibernateenverstestapplication.class, args);                 accountrepository accountrepo = ac.getbean(accountrepository.class);                 //account account = accountrepo.findone(1003l);                 account account = new account();                 account.setbudgetamount(6666.4)                         .setbudgetwarningpercentage(66666.2)                         .setcontactid(3333)                         .setdepartmentlevel(44444)                         .setisenabled(true)                         .setissentbudgetwarning(false)                         .setissmartsuppenabled(true)                         .setjabberid("en dit aanpassing 4")                         .setname("henk");                 accountrepo.save(account);     }              @override     public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception {         this.ac = applicationcontext;     } } 

root config

@configuration @propertysources(value = {@propertysource("classpath:application.properties")}) @componentscan//(basepackages={"repository"}) @enablejparepositories//(basepackages={"repository"}) @enabletransactionmanagement public class rootconfig {    @value("${spring.datasource.url}")   private string databaseurl;   @value("${spring.datasource.driver}")   private string driver;   @value("${spring.datasource.username}")   private string username;   @value("${spring.datasource.password}")   private string password;   @value("${spring.datasource.strategy}")   private string strategy;  @bean(destroymethod = "close") public datasource seeddatasource(){     hikariconfig hikariconfig = new hikariconfig();     hikariconfig.setdriverclassname(driver);     hikariconfig.setjdbcurl(databaseurl);      hikariconfig.setusername(username);     hikariconfig.setpassword(password);      hikariconfig.setmaximumpoolsize(5);     hikariconfig.setconnectiontestquery("select 1");     hikariconfig.setpoolname("springhikaricp");      hikariconfig.adddatasourceproperty("datasource.cacheprepstmts", "true");     hikariconfig.adddatasourceproperty("datasource.prepstmtcachesize", "250");     hikariconfig.adddatasourceproperty("datasource.prepstmtcachesqllimit", "2048");     hikariconfig.adddatasourceproperty("datasource.useserverprepstmts", "true");      hikaridatasource datasource = new hikaridatasource(hikariconfig);      return datasource; }        @bean   jpatransactionmanager transactionmanager(entitymanagerfactory entitymanagerfactory) {     jpatransactionmanager transactionmanager = new jpatransactionmanager();     transactionmanager.setentitymanagerfactory(entitymanagerfactory);     return transactionmanager;   }    @bean public localcontainerentitymanagerfactorybean entitymanagerfactory(datasource datasource,                                                                  jpavendoradapter jpavendoradapter){   localcontainerentitymanagerfactorybean entitymanagerfactory = new localcontainerentitymanagerfactorybean();   properties props = new properties();   props.put("org.hibernate.envers.audit_strategy","org.hibernate.envers.strategy.validityauditstrategy");   props.put("org.hibernate.envers.audit_strategy_validity_store_revend_timestamp", "true");   props.put("org.hibernate.envers.track_entities_changed_in_revision","true");   props.put("org.hibernate.envers.global_with_modified_flag","true");   props.put("org.hibernate.envers.store_data_at_delete", "true");   props.put("hibernate.listeners.envers.autoregister", "true");    entitymanagerfactory.setdatasource(datasource);   entitymanagerfactory.setjpavendoradapter(jpavendoradapter);   entitymanagerfactory.setpackagestoscan("com.example.pojo");   entitymanagerfactory.setjpaproperties(props);   return entitymanagerfactory; }  @bean public jpavendoradapter jpavendoradapter(){     hibernatejpavendoradapter adapter = new hibernatejpavendoradapter();     adapter.setdatabase(database.mysql);     adapter.setshowsql(false);     adapter.setgenerateddl(true);     adapter.setdatabaseplatform("org.hibernate.dialect.mysqldialect");     return adapter; }    } 

even though made entity listener @component, jpa uses instance of class , not spring managed bean. that's why you're getting nullpointerexception. accounthistoryrepo null.


Comments

Popular posts from this blog

angular - Ionic slides - dynamically add slides before and after -

minify - Minimizing css files -

Add a dynamic header in angular 2 http provider -