java - Hibernate 问题 java.lang.Boolean 无法转换为 java.lang.String 使用 JDK 1.7

标签 java hibernate java-7 java-6

我遇到了 Hibernate 的问题。

使用 Hibernate 3.2.6 和 JDK 1.7.0_21

这个问题是由于 JDK 与 Hibernate 版本的兼容性导致的吗?

这个问题是随机的。我仍然找不到重现的步骤。

2014-07-14 06:09:10,661 [DEBUG] EventExpenseAreaService.getEventSummary:654 - Revenue Value (Hari) --> 1166.15
2014-07-14 06:09:18,665 [ERROR] EventSetupService.getEventById:1451 - java.lang.Boolean cannot be cast to java.lang.String
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
    at org.hibernate.type.StringType.toString(StringType.java:44)
    at org.hibernate.type.NullableType.nullSafeToString(NullableType.java:93)
    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:140)
    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:107)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2376)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2312)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2612)
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:96)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at com.sibisoft.northstar.events.service.EventSetupService.getEventById(EventSetupService.java:1441)
    at com.sibisoft.northstar.events.struts.EventAction.load(EventAction.java:1037)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

代码getEventById

public EventDTO getEventById(Integer eventId,boolean logActivity, Session session)throws Exception {

    EventDTO event = null;
    Transaction transaction = null;
    try {

        if (session == null) {
            session = HibernateSessionFactory.getSession();
            if(logActivity){
                transaction = session.beginTransaction();
            }
        }

        event = (EventDTO) super.getByPrimaryKey(EventDTO.class, eventId,session);


        if(transaction!=null){
            transaction.commit();
        }

    } catch (HibernateException e) {
        LOGGER.error(e.getMessage(), e);
        if(transaction!=null){
            transaction.rollback();
        }
        throw e;
    }catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        if(transaction!=null){
            transaction.rollback();
        }
        throw e;
    }

    return event;

}

方法:getByPrimaryKey

protected BaseEventDTO getByPrimaryKey(Class clazz, Integer pk,Session session) throws Exception{

    BaseEventDTO dto = null;
    Transaction tx = null;

    try {

        if (session == null)  {
            session = HibernateSessionFactory.getSession();
        }
        dto = (BaseEventDTO) session.get(clazz, pk);
        return dto;

    }
    catch(Exception e){
        LOGGER.error(e);
        if (tx !=null) {
            tx.rollback();
        }
        throw e;
    }
}

最佳答案

JDK 7 已经更改了 Class.getDeclaredMethods() 因此不能保证顺序。 [click here]

您可能在对象映射中有一个属性具有 getter 方法 String getProperty() 以及 Boolean isPropery() 间歇性地导致问题。

Hibernate 3 BasicPropertyAccessor.getterMethod(...) 有时会找到 getProperty() 有时会因为未指定的顺序找到 isProperty()在 JDK 7 中通过 getDeclaredMethods()。这让 hibernate 感到困惑,它为 String 类型的属性调用 Boolean 类型的方法。

您需要重命名一个方法才能获得预期的结果。

Hibernate 论坛上的类似问题:https://forum.hibernate.org/viewtopic.php?p=2474641

关于java - Hibernate 问题 java.lang.Boolean 无法转换为 java.lang.String 使用 JDK 1.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749962/

相关文章:

java - 不相交集数据结构是在 Java 中本地实现的吗?

java - Hibernate配置文件错误

java - Hibernate 不一致地加载 Postgresql bytea

java - 对不同 Java 集合进行基准测试的最佳实践是什么?

java - 平板电脑上的 ListView

java - 在 WebView 中播放网站的声音?

java - jvm如何保证java核心库的安全?

java - Hibernate:将列子字符串映射到字段

java - SWT FileDialog 在带有 Oracle Java 7 的 Mac OSX 上不能正常工作

scala - 如何在 Scala 中使用 java.nio.file.Files.walkFileTree