Java DirectPropertyAccessor的更换?
我正在将Spring4.3.2项目升级到Spring5.1.5。 我的一个测试用例因错误而失败 ClassNotFoundException:org.hibernate.property.DirectPropertyAccessor 这是有道理的,因为它在Hibernate5.x中已被弃用,Hibernate5.x是Spring5.x的最低兼容Hibernate版本。我在我的hbm.xml中使用它,如下所示: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=
<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集成的变更日志中。