Java DirectPropertyAccessor的更换?

Java DirectPropertyAccessor的更换?,java,spring,hibernate-5.x,hbm,hbmxml,Java,Spring,Hibernate 5.x,Hbm,Hbmxml,我正在将Spring4.3.2项目升级到Spring5.1.5。 我的一个测试用例因错误而失败 ClassNotFoundException:org.hibernate.property.DirectPropertyAccessor 这是有道理的,因为它在Hibernate5.x中已被弃用,Hibernate5.x是Spring5.x的最低兼容Hibernate版本。我在我的hbm.xml中使用它,如下所示: <class name="Notification" table=

我正在将Spring4.3.2项目升级到Spring5.1.5。 我的一个测试用例因错误而失败

ClassNotFoundException:org.hibernate.property.DirectPropertyAccessor

这是有道理的,因为它在Hibernate5.x中已被弃用,Hibernate5.x是Spring5.x的最低兼容Hibernate版本。我在我的hbm.xml中使用它,如下所示:

<class name="Notification"
       table="T_NOTIFICATION"
       lazy="false">

    <id name="id"
        type="integer"
        column="ID"
        unsaved-value="null"
        access="property">
        <generator class="identity"/>
    </id>

    <!-- A versioned entity. -->
    <version name="version"
             column="VERSION"
             access="org.hibernate.property.DirectPropertyAccessor"/>


为了保持相同的行为,我应该用什么替换访问字段?

问题不在于Spring版本,而在于Hibernate版本

org.hibernate.property.DirectPropertyAccessor
在hibernate的5.x版本中被弃用

DirectPropertyAccessor
应替换为更高hibernate版本中的
org.hibernate.property.access.internal.PropertyAccessFieldImpl
org.hibernate.property.access.internal.PropertyAccessMixedImpl

使用
access=
只有在您有自己的自定义版本时才应该使用它要使用的类。如果要使用直接字段访问而不是属性,请使用
access=“field”
而不是现有的内容。另见


在内部,当前版本将使用
DirectPropertyAccessor
升级Hibernate时,它将自动适应新引入的要使用的其他类。现在,负担在于hibernate,而不必了解hibernate的内部API

通过
org.hibernate.property.access.internal.PropertyAccessMixedImpl
我看到错误:
由以下原因引起:java.lang.NoSuchMethodException:org.hibernate.property.access.internal.PropertyAccessMixedImpl。()
org.hibernate.property.access.internal.PropertyAccessFieldImpl
我明白了:
原因是:java.lang.NoSuchMethodException:org.hibernate.property.access.internal.PropertyAccessFieldImpl。
我已经签出了这个,不幸的是它对我不起作用。我使用了很多,你能更具体一点吗?对于Hibernate,我使用
Hibernate核心:5.4.1.Final
您需要创建实现PropertyAccessFieldImpl的新类,并在xml文件中指定实现
PropertyAccessFieldImpl的类?但它不是抽象类或接口。它已经实现了PropertyAccess,你能给我举一个例子来证实这一点吗?hibernate中的弃用和Spring有什么关系?这与hibernate相关,与spring无关。另外,为什么不直接使用
access=“field”
来间接实现同样的功能,而不必绑定到特定的Hibernate版本。@M.Deinum我很抱歉,我对问题进行了编辑,以更好地反映我试图传达的内容。我不确定
access=“field”
是如何工作的。我来试试。
access=“field”
告诉hibernate您想要字段访问,而不是使用getter/setter,这也是DirectPropertyAccessor
的功能。最终,它将导致相同的配置,但有一个额外的优势,它是可移植到较新的hibernate版本。谢谢,这正是我需要的。我刚试过。但是,我仍然看到一个错误,
javax.persistence.TransactionRequiredException:com.xxx.server.accessFabric.dao.impl.AccessPointDAOImplTest.setUp(AccessPointDAOImplTest.java:54)上没有进行任何事务处理,因为除了用
字段替换
DirectPropertyAccessor
,我没有做任何其他更改。我怀疑这是一种副作用?您正在尝试在没有事务的情况下保存某些内容,而这些内容以前也应该失败。在Spring5中,hibernate的支持在这方面有所改变。如果配置错误,现在就不那么宽容了。我刚刚修改了上面的评论。简言之,关于Spring5和hibernate集成的更改已经完成,因此如果您不遵守这些规则,可能会导致测试失败。如果您保留Spring4.3.x并只升级到Hibernate5(看起来您同时升级了两个东西),您可能会看到相同的情况。这就是为什么我总是建议采取一些小步骤,而不是一次完成所有事情。当然,你能告诉我描述这些更严格配置检查的文档吗?不,它们在Spring 5/Hibernate 4+5集成的变更日志中。