You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:54:35