Hibernate 4.3.11升级至5.4.23时多实体共用同一代理接口的不支持错误排查求助
Hibernate 4.3.11升级至5.4.23时多实体共用同一代理接口的不支持错误排查求助
大家好,我正在给一个旧系统做技术栈升级,目前卡在从Hibernate 4.3.11升级到5.4.23这一步。这个系统还在使用XML映射文件,我把Nomination相关的映射文件放在了下面。
我已经跟着官方指南和文档完成了大部分必要的改动,但现在启动应用时碰到了这个运行时错误:
datasource-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Multiple entities [com.app.application.nomination.domain.AnnualNomination, com.app.application.nomination.domain.IntraDayNomination] named the same interface [com.app.application.nomination.domain.Nomination] as their proxy which is not supported
我不太清楚为什么Hibernate现在不允许这么做,也不知道该怎么修复。如果有大佬能分享经验,我会非常感激!
我的技术栈如下:
- Java 11
- Spring 5
- Hibernate 5
数据源配置文件(datasource-config.xml)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${datasource.driverClassName}"/> <property name="url" value="${datasource.url}"/> <property name="username" value="${datasource.username}"/> <property name="password" value="${datasource.password}"/> <property name="initialSize" value="${datasource.initialPoolSize}" /> <property name="minIdle" value="${datasource.minPoolSize}" /> <property name="maxIdle" value="${datasource.maxPoolSize}" /> <property name="maxActive" value="${datasource.maxStatements}" /> <property name="validationQuery" value="select 1 from dual"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="false"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:com/app/application/hibernate.cfg.xml</value> </property> <property name="packagesToScan" value="com.amor"/> </bean> <bean id="persistenceContext" class="com.app.application.core.dao.hibernate.DefaultHibernatePersistenceContext"> <constructor-arg ref="sessionFactory" /> </bean> </beans>
Nomination映射文件(nomination.hbm.xml)
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-access="field"> <typedef name="NominationStatus" class="com..application.core.dao.hibernate.usertype.EnumUserType"> <param name="enumClassName">com..application.nomination.domain.NominationStatus</param> </typedef> <typedef name="NominationType" class="com..application.core.dao.hibernate.usertype.EnumUserType"> <param name="enumClassName">com..application.nomination.domain.NominationType</param> </typedef> <class table="NOMINATION" name="com..application.nomination.domain.NominationImpl" proxy="com..application.nomination.domain.Nomination" abstract="true" > <id name="id" type="java.lang.Long"> <column name="ID" precision="20" scale="0" /> <generator class="sequence"> <param name="sequence">NOMINATION_ID_SEQ</param> </generator> </id> <discriminator column="NOMINATION_TYPE" type="string" /> <component name="nominationDetails" class="com..application.nomination.domain.NominationDetails"> <property name="gasDay" type="LocalDate"> <column name="GAS_DAY" not-null="true" /> </property> <many-to-one name="flowpath" class="com..application.network.domain.FlowpathImpl"> <column name="FLOWPATH_ID" not-null="true" /> </many-to-one> <many-to-one name="shipper" class="com..application.network.domain.ShipperImpl"> <column name="SHIPPER_ID" not-null="true" /> </many-to-one> <property name="submittedDateTime" type="DateTime"> <column name="SUBMITTED_DATE_TIME" not-null="true" /> </property> <property name="effectiveDateTime" type="DateTime"> <column name="EFFECTIVE_DATE_TIME" not-null="false" /> </property> <property name="nominationStatus" type="NominationStatus" not-null="true"> <column name="NOMINATION_STATUS" length="64" /> </property> <property name="nominationType" type="NominationType" column="NOMINATION_TYPE" insert="false" update="false" /> <property name="revisionNumber" type="int"> <column name="REVISION_NUMBER" scale="0" not-null="true" /> </property> <property name="superseded" type="yes_no"> <column name="SUPERSEDED" length="1"/> </property> <property name="curtailed" type="yes_no"> <column name="CURTAILED" length="1"/> </property> <many-to-one name="estimatedCondensate" class="com..application.data.domain.datapoint.EnergyDataValueImpl" fetch="select" cascade="all"> <column name="ESTIMATED_CONDENSATE_ID" not-null="false" /> </many-to-one> <many-to-one name="deliveryRequirementVolume" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="DELIVERY_REQ_VOLUME_ID" not-null="false" /> </many-to-one> <many-to-one name="deliveryRequirementEnergy" class="com..application.data.domain.datapoint.EnergyDataValueImpl" fetch="select" cascade="all"> <column name="DELIVERY_REQ_ENERGY_ID" not-null="false" /> </many-to-one> <many-to-one name="nominatedEnergy" class="com..application.data.domain.datapoint.EnergyDataValueImpl" fetch="select" cascade="all"> <column name="NOMINATED_ENERGY_ID" not-null="false" /> </many-to-one> <many-to-one name="nominatedVolumeFirm" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="NOMINATED_VOLUME_FIRM_ID" not-null="false" /> </many-to-one> <many-to-one name="nominatedVolumeInterruptible" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="NOMINATED_VOLUME_INT_ID" not-null="false" /> </many-to-one> <many-to-one name="curtailedVolumeFirm" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="REVISED_VOLUME_FIRM_ID" not-null="false" /> </many-to-one> <many-to-one name="curtailedVolumeInterruptible" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="REVISED_VOLUME_INT_ID" not-null="false" /> </many-to-one> <many-to-one name="redeliveryRequirementEnergy" class="com..application.data.domain.datapoint.EnergyDataValueImpl" fetch="select" cascade="all"> <column name="REDELIVERY_REQ_ENERGY_ID" not-null="true" /> </many-to-one> <many-to-one name="redeliveryRequirementVolume" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="REDELIVERY_REQ_VOLUME_ID" not-null="false" /> </many-to-one> <many-to-one name="redeliveryVolume" class="com..application.data.domain.datapoint.VolumeDataValueImpl" fetch="select" cascade="all"> <column name="REDELIVERY_VOLUME_ID" not-null="false" /> </many-to-one> <many-to-one name="redeliveryEnergy" class="com..application.data.domain.datapoint.EnergyDataValueImpl" fetch="select" cascade="all"> <column name="REDELIVERY_ENERGY_ID" not-null="false" /> </many-to-one> <property name="comment" type="java.lang.String"> <column name="NOMINATION_COMMENT" length="3000" not-null="false" /> </property> <property name="interimImbalance" type="RTNumber"> <column name="INTERIM_IMBALANCE" not-null="false" /> </property> <property name="locked" type="yes_no"> <column name="LOCKED" length="1"/> </property> <property name="confirmedByTransporter" type="yes_no"> <column name="CONFIRMED_BY_TRANSPORTER" length="1"/> </property> <many-to-one name="systemUser" class="com..application.security.domain.NgcSystemUserImpl" fetch="select"> <column name="SYSTEM_USER_ID" length="32" not-null="true" /> </many-to-one> </component> <subclass discriminator-value="ANNUAL" name="com..application.nomination.domain.AnnualNomination" proxy="com..application.nomination.domain.Nomination" /> <subclass discriminator-value="MONTHLY" name="com..application.nomination.domain.MonthlyNomination" proxy="com..application.nomination.domain.Nomination" /> <subclass discriminator-value="DAILY" name="com..application.nomination.domain.DailyNomination" proxy="com..application.nomination.domain.Nomination" /> <subclass discriminator-value="INTRA_DAY" name="com..application.nomination.domain.IntraDayNomination" proxy="com..application.nomination.domain.Nomination" /> <subclass discriminator-value="DAILY_TRUE_UP" name="com..application.nomination.domain.DailyTrueUpNomination" proxy="com..application.nomination.domain.Nomination" /> <subclass discriminator-value="MONTHLY_TRUE_UP" name="com..application.nomination.domain.MonthlyTrueUpNomination" proxy="com..application.nomination.domain.Nomination" /> </class> <query name="findAnnualNominationsApplicableBetweenDates"><![CDATA[ select n1 from AnnualNomination as n1 where n1.nominationDetails.effectiveDateTime between (select max(n2.nominationDetails.effectiveDateTime) from AnnualNomination n2 where n2.nominationDetails.effectiveDateTime < :startDate) and (select max(n3.nominationDetails.effectiveDateTime) from AnnualNomination n3 where n3.nominationDetails.effectiveDateTime < :endDate) ]]></query> </hibernate-mapping>
备注:内容来源于stack exchange,提问作者dynamo
相关产品推荐
相关产品推荐

