2014-08-28 63 views
0

我正在爲JPA項目編寫代碼(使用spring的hibernate)。org.hibernate.PropertyValueException:非空屬性引用空值或瞬態值:僅使用@Scheduled的異常

問題現在面臨的是當我與@Scheduled註釋我得到異常執行以下interestCalculation()方法:在quartsTestdDisplay()for循環將完全執行

org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : com.mad.app.domain.DemandLedgerMap.demandLedger; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : com.mad.app.domain.DemandLedgerMap.demandLedger 

後。但是,執行for循環後,執行沒有預定數據的同樣的方法時,持續/更新。 只有當從@Scheduled觸發的方法引發異常。

以下是我的代碼,一個是deligate層類另一個是服務層類。 在委託層中,我使用@Scheduled作爲日程表觸發器interestCalculation()

@Controller 
    public class DcbDailyBalanceDelegate { 

@Autowired 
private DcbDailyBalanceService dcbDailyBalanceService; 
/** 
* El name. 
*/ 
public static final String EL_NAME = "#{dcbDailyBalanceDelegate}"; 

@Transactional 
@Scheduled(cron="0 37 11 ? * THU") 
public void interestCalculation() 
{ 
    //dcbDailyBalanceService.dcbBalanceToDcbDailybalance(); 
    dcbDailyBalanceService.quartsTestdDisplay(); 
} 

} 

@Transactional 
public void quartsTestToUpdate() 
{ 

    for (int i = 0; i < 3000; i++) { 

     DcbDailyBalance dcbDailyBalance=new DcbDailyBalance(); 

     DemandLedgerMap demandLedgerMap=new DemandLedgerMap(); 

     DledgerApplicableMap dledgerApplicableMap=new DledgerApplicableMap(); 

     demandLedgerMap.setDldgrMapId(1); 
     dledgerApplicableMap.setDlamapId(1); 

     dcbDailyBalance.setDcbbalAmount(1000+i); 
     dcbDailyBalance.setDcbbalDataSource((byte) 0); 
     dcbDailyBalance.setDcbbalDate(1409120385); 
     dcbDailyBalance.setDcbbalIntrstAmount(100+i); 
     dcbDailyBalance.setDcbbalLastupdated(1409120385); 
     dcbDailyBalance.setDemandLedgerMap(demandLedgerMap); 
     dcbDailyBalance.setDledgerApplicableMap(dledgerApplicableMap); 

     DcbDailyBalance dailyBalance=dailyBalanceDao.update(dcbDailyBalance); 

    } 
    } 

這裏的例外:

org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : com.mad.app.domain.DemandLedgerMap.demandLedger; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : com.mad.app.domain.DemandLedgerMap.demandLedger 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:206) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:154) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:519) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:646) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at com.mad.app.controller.dcb.DcbDailyBalanceDelegate$$EnhancerByCGLIB$$7abb9f11.interestCalculation(<generated>) ~[spring-core-4.0.0.RELEASE.jar:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_55] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_55] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_55] 
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.7.0_55] 
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [na:1.7.0_55] 
    at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.7.0_55] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source) [na:1.7.0_55] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) [na:1.7.0_55] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_55] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_55] 
    at java.lang.Thread.run(Unknown Source) [na:1.7.0_55] 


Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value : com.mad.app.domain.DemandLedgerMap.demandLedger 
    at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:106) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:309) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:160) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:231) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:102) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:55) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1218) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:421) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final] 
    at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77) ~[hibernate-entitymanager-4.3.1.Final.jar:4.3.1.Final] 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE] 
    ... 22 common frames omitted 

下面是DcbDailyBalance類

下面是DemandLedgerMap類

import java.io.Serializable; 
    import java.util.List; 

    import javax.persistence.CascadeType; 
    import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.FetchType; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.GenerationType; 
    import javax.persistence.Id; 
    import javax.persistence.JoinColumn; 
    import javax.persistence.ManyToOne; 
    import javax.persistence.NamedQuery; 
    import javax.persistence.OneToMany; 
    import javax.persistence.Table; 

    import org.hibernate.annotations.Cascade; 

    import com.mad.app.common.domain.BusinessEntity; 


    /** 
    * The persistent class for the demand_ledger_map database table. 
    * 
    */ 
    @Entity 
    @Table(name="demand_ledger_map") 
    @NamedQuery(name="DemandLedgerMap.findAll", query="SELECT d FROM DemandLedgerMap d") 
    public class DemandLedgerMap extends BusinessEntity implements Serializable { 
     private static final long serialVersionUID = 1L; 
     private int dldgrMapId; 
     private byte dldgrMapRowStatus; 
     private List<DcbLine> dcbLines; 
     private DemandLedger demandLedger; 
     private UnitAllocation unitAllocation; 
     private List<DcbDailyBalance> dcbDailyBalances; 

     public DemandLedgerMap() { 
     } 


     @Id 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     @Column(name="DLDGR_MAP_ID", unique=true, nullable=false, columnDefinition = "TINYINT") 
     public int getDldgrMapId() { 
      return this.dldgrMapId; 
     } 

     public void setDldgrMapId(int dldgrMapId) { 
      this.dldgrMapId = dldgrMapId; 
     } 


     @Column(name="DLDGR_MAP_ROW_STATUS", nullable=false) 
     public byte getDldgrMapRowStatus() { 
      return this.dldgrMapRowStatus; 
     } 

     public void setDldgrMapRowStatus(byte dldgrMapRowStatus) { 
      this.dldgrMapRowStatus = dldgrMapRowStatus; 
     } 


     //bi-directional many-to-one association to DcbLine 
     @OneToMany(mappedBy="demandLedgerMap") 
     public List<DcbLine> getDcbLines() { 
      return this.dcbLines; 
     } 

     public void setDcbLines(List<DcbLine> dcbLines) { 
      this.dcbLines = dcbLines; 
     } 

     public DcbLine addDcbLine(DcbLine dcbLine) { 
      getDcbLines().add(dcbLine); 
      dcbLine.setDemandLedgerMap(this); 

      return dcbLine; 
     } 

     public DcbLine removeDcbLine(DcbLine dcbLine) { 
      getDcbLines().remove(dcbLine); 
      dcbLine.setDemandLedgerMap(null); 

      return dcbLine; 
     } 


     //bi-directional many-to-one association to DemandLedger 
     @ManyToOne(fetch=FetchType.LAZY, cascade = { CascadeType.ALL }) 
     @JoinColumn(name="DLDGR_MAP_DLDGR_ID", nullable=false) 
     public DemandLedger getDemandLedger() { 
      return this.demandLedger; 
     } 

     public void setDemandLedger(DemandLedger demandLedger) { 
      this.demandLedger = demandLedger; 
     } 


     //bi-directional many-to-one association to UnitAllocation 
     @ManyToOne(fetch=FetchType.LAZY, cascade = { CascadeType.ALL }) 
     @JoinColumn(name="DLDGR_MAP_UALLOC_ID", nullable=false) 
     public UnitAllocation getUnitAllocation() { 
      return this.unitAllocation; 
     } 

     public void setUnitAllocation(UnitAllocation unitAllocation) { 
      this.unitAllocation = unitAllocation; 
     } 

     //bi-directional many-to-one association to DcbDailyBalance 
      @OneToMany(mappedBy="demandLedgerMap") 
      @Cascade(org.hibernate.annotations.CascadeType.ALL) 
      public List<DcbDailyBalance> getDcbDailyBalances() { 
       return this.dcbDailyBalances; 
      } 

      public void setDcbDailyBalances(List<DcbDailyBalance> dcbDailyBalances) { 
       this.dcbDailyBalances = dcbDailyBalances; 
      } 

      public DcbDailyBalance addDcbDailyBalance(DcbDailyBalance dcbDailyBalance) { 
       getDcbDailyBalances().add(dcbDailyBalance); 
       dcbDailyBalance.setDemandLedgerMap(this); 

       return dcbDailyBalance; 
      } 

      public DcbDailyBalance removeDcbDailyBalance(DcbDailyBalance dcbDailyBalance) { 
       getDcbDailyBalances().remove(dcbDailyBalance); 
       dcbDailyBalance.setDemandLedgerMap(null); 

       return dcbDailyBalance; 
      } 

    } 

請人幫我解決這個問題

+0

發佈您的DcbDailyBalance和DemandLedgerMap類。 – 2014-08-28 07:04:00

+0

@ VIMAL貝拉DcbDailyBalance和DemandLedgerMap類貼..請幫助我.. – mady 2014-08-28 07:28:49

+0

現在檢查答案。 – 2014-08-28 09:11:48

回答

0

PropertyValueException:非空屬性引用null或 瞬時值:com.kssidc.app.domain.DemandLedgerMap.demandLedger

此明確指出,在類DemandLedgerMap您要堅持demandLedger,這是一個不可空的字段。 因此,當您使用dcbDailyBalanceService.quartsTestdDisplay();時,您並未提供此值。

因此,當持續/更新它時,它將查找demandLedger的值並獲取null值,從而引發異常。

+0

謝謝Ekansh ..雅你是對我不提供DemandLedgerMap.demandLedger對象的值,但這裏的問題是我得到的異常,只有當dcbDailyBalanceService.quartsTestdDisplay();方法從'@Scheduled'調度程序執行,當從jsf actionlistner數據執行的相同方法持久化到db而不引發任何異常時。我正在使用entitymanager.merge(實體)來保存數據。 – mady 2014-08-28 09:16:30

+0

請仔細檢查'entitymanager.merge(entity)'是否正在更新或不更新。我希望它可能沒有做任何事情。如果不是那麼嘗試** em.getTransaction()。begin(); em.merge(entity); em.getTransaction()提交(); **檢查你正在在任何一種情況下例外,如果二者中的任何成功的做了什麼,他們有盡而意。 – 2014-08-28 09:27:39

+0

沒有什麼更新到數據庫的for循環完全執行我不會得到任何異常時,實體正在沖洗當時獲得空性檢查異常。 – mady 2014-08-28 09:32:08

0

您正在努力堅持DcbDailyBalance類,其中有DemandLedgerMap類。但在DemandLedgerMapdldgrMapRowStatusdemandLedger列設置爲nullable=false,並且您沒有爲此傳遞價值。

這就是爲什麼當你試圖堅持DcbDailyBalance,它是拋出異常。希望很清楚。

+0

這裏的需求者也是一個實體DemandLedgerMAp與DemandLedger具有多對一的映射關係。我只想將數據保存在DcbDailyBalnce中,以便設置所有將在DcbDailyBalnce中保留的值。 demandLedger是在DemandLedgerMap實體DemandLedger型可變我不甲肝任何數據,或用戶將在屏幕(瀏覽器),用於demandLedger數據保存到DemandLedgerMap我將數據設置爲demandLedger只有當不輸入任何數據。 – mady 2014-08-28 09:27:32

+0

DcbDailyBalance變量(私人詮釋dcbbalId; \t私人雙dcbbalAmount; \t專用字節dcbbalDataSource; \t私人詮釋dcbbalDate; \t私人詮釋dcbbalLastupdated; \t專用字節dcbbalRowStatus; \t私人雙dcbbalIntrstAmount; \t私人DemandLedgerMap demandLedgerMap; \t private DledgerApplicableMap dledgerApplicableMap;) – mady 2014-08-28 09:27:57

+0

然後不要在DcbDailyBalance對象中設置DemandLedgerMAp。它會正常工作 – 2014-08-28 09:28:54

0

您需要將「dcbDailyBalance」添加到demandLedgerMap列表中,然後插入demandLedgerMap。當您嘗試更新dcbDailyBalance時,它會嘗試保存dcbDailyBalance,然後「級聯」並保存demandLedgerMap,因此demandLedgerMap「爲空或瞬態值」。 Saving demandLedgerMap將創建並需求LedgerMap.id,並且它不再是暫時的,那麼您可以節省dcbDailyBalance。試試這個:

demandLedgerMap.addaddDcbDailyBalance(dcbDailyBalance); 
demandLedgerMapDAO.update(dailyBalanceDao); 
相關問題