我在尝试使用休眠删除时遇到问题。当我尝试删除时,我得到一个异常,说孩子存在并且存在 FK 违规。我也想删除孩子,但删除似乎不是级联的。在尝试解决这个问题大约一周后,我读到我应该使用 HibernateInterceptor 来保持会话打开,以便可以加载孩子。当我现在尝试执行此操作时,出现以下错误:
Failed to load portlet com.blah.blah.CommunicationsPortlet: java.lang.ClassCastException: $Proxy27 incompatible with com.blah.blah.HibernateCommunicationsDAOImpl
这是我的映射文件的摘录:
<set name="communicationCountries" inverse="true" cascade="all,delete-orphan">
<key column="COM_ID" not-null="true" on-delete="cascade" />
<one-to-many class="com.blah.blah.CommunicationCountry"/>
</set>
以下是应用程序上下文的摘录:
<bean id="hibernateCommunicationsDAOImplTarget"
class="com.blah.blah.dao.impl.HibernateCommunicationsDAOImpl">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="hibernateCommunicationsDAOImpl" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref bean="hibernateCommunicationsDAOImplTarget"/></property>
<property name="proxyInterfaces">
<value>com.blah.blah.dao.CommunicationsDAO</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
这是我的 DAO 中的方法:
public void deleteCommunication(Integer id) throws DataAccessException
{
HibernateTemplate hibernate = getHibernateTemplate();
Communication existing = (Communication)hibernate.get(Communication.class, id);
hibernate.initialize( existing.getCommunicationCountries());
hibernate.delete(existing);
}
我真的不知道我做错了什么。我没有一个非常复杂的模式,只有一个导致孩子(国家)的表。有什么想法可以解决这个问题吗?