【问题标题】:Hibernate exception java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.util.DateHibernate 异常 java.lang.ClassCastException: java.lang.Boolean 不能转换为 java.util.Date
【发布时间】:2014-06-01 10:57:27
【问题描述】:

在我们的项目中,我们面临下面的堆栈跟踪异常。它有时在对象合并期间发生(我无法重现它)。我不完全知道哪个对象会导致此错误,因为有很多级联。环境无关紧要,生产环境和开发环境都有。

我们使用 Hibernate 4.2.5.Final、Spring 3.2.2.RELEASE、Java 7、Tomcat 7。

java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.util.Date
at org.hibernate.type.descriptor.java.JdbcTimestampTypeDescriptor.areEqual(JdbcTimestampTypeDescriptor.java:41)
at org.hibernate.type.AbstractStandardBasicType.isEqual(AbstractStandardBasicType.java:205)
at org.hibernate.type.AbstractStandardBasicType.isSame(AbstractStandardBasicType.java:195)
at org.hibernate.type.AbstractStandardBasicType.isDirty(AbstractStandardBasicType.java:231)
at org.hibernate.type.AbstractStandardBasicType.isDirty(AbstractStandardBasicType.java:227)
at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4037)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:527)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:234)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:163)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:228)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:100)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
at org.springframework.orm.hibernate4.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:91)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:925)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:738)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy115.method(Unknown Source)
at com.some.package.OurClass.method(OurClass.java:114)

编辑:方法“com.some.package.OurClass.method”刚刚做了Hibernate merge()操作。

【问题讨论】:

  • 在给出明确答案之前,您需要提供代码来演示发生这种情况的位置。
  • 您至少需要为com.some.package.OurClass.method(OurClass.java:114) 提供代码,并且根据所涉及的实体,可能还需要为您的 Hibernate 实体提供源代码。

标签: java spring hibernate


【解决方案1】:

我又看了一遍,找到了原因。我们的域对象中有字段,名称为“created”(日期类型)和瞬态方法 isCreated。方法如下所示:

@Column(...)
public Date getCreated() {
    return created;
}

@Transient
public boolean isCreated() {
    return isStatus(StatusType.CREATED);
}

我通过将方法 isCreated 重命名为 isCreatedStatus() 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多