2014-08-28 45 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); 
相关问题