[英]Delete one-to-one: Hibernate 3 + Spring 3 + PostgreSQL 9.1
这是我的第一篇文章,是Hibernate + Spring的新手。 我在applicationContext.xml文件中将XML用于Hibernate映射声明。
简要地说,我正在尝试做:
parent.setChild(null);
parentDao.update(parent);
希望它将删除孩子。 但这是行不通的。 :(
相反,我有这个异常:
造成原因:org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255)处的org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232)处的org.hibernate.engine.Cascade处的java.lang.NullPointerException在org.hibernate.engine.Cascade.cascade(Cascade.java:127)在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)处的.cascade(Cascade.java:161)。在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)处的event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)在org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java: 57)在org.hibernate.impl.SessionImpl.update(SessionImpl)上的org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)在org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742) 。 java:730)在org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)在org.springframework.orm.hibernate3.HibernateTemplate $ 14.doInHibernate(HibernateTemplate.java:708)在org.springframework.orm.hibernate3。 org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)的org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705)的HibernateTemplate.doExecute(HibernateTemplate.java:406) .springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:701)位于fr.gouv.travail.gestionAccords.server.dao.implementations.DossierDAOImpl.update(DossierDAOImpl.java:163)位于sun.reflect.NativeMethodAccessorImpl.invoke0 (原生方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)位于sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java.lang.reflect.Method.invoke(Method.java:597) ),网址为org.springframework.aop.support.AopUtils.invo org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)的org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)的keJoinpointUsingReflection(AopUtils.java:318) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)上的.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.invoke(Jdk。 :202),位于fr.gouv.travail.gestionAccords.server.business.gestionDossiers.detailsDossier.commons.implementations.DetailsDossierBusinessImpl.update(DetailsDossierBusinessImpl.java:396)上的$ Proxy38.update(未知源)上
我已经看到我必须在XML映射文件中声明delete-orphan
,但这让我发疯,因为它不想工作。 你能看看有什么问题吗?
因此,在我当前的项目中,我具有一对一的关系:这是我的父级DossierBean的 XML映射。
DossierBean.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="fr.gouv.travail.gestionAccords.server.dao.beans.pojo.DossierBean" table="dos">
<id name="numeroDossier" type="string">
<column name="num_dos" />
<generator class="assigned" />
</id>
<one-to-one name="travailleurHandicape" class="fr.gouv.travail.gestionAccords.server.dao.beans.pojo.TravailleurHandicapeBean" cascade="all,delete-orphan" lazy="false" />
// Other properties...
</class>
</hibernate-mapping>
TravailleurHandicapeBean.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="fr.gouv.travail.gestionAccords.server.dao.beans.pojo.TravailleurHandicapeBean" table="tha">
<id name="numeroDossier" type="string">
<column name="num_dos" />
<generator class="foreign">
<param name="property">dossier</param>
</generator>
</id>
<one-to-one name="dossier" class="fr.gouv.travail.gestionAccords.server.dao.beans.pojo.DossierBean" constrained="true" />
<property name="dateAgrement" column="dt_agrement" type="date"/>
<property name="dureeAgrement" column="dur_agrement" type="integer"/>
<property name="indicateurRenouv" column="ind_renouv" type="character"/>
</class>
</hibernate-mapping>
DossierBean.java(父bean) :
@Named("dossierBean")
@Scope("prototype")
public class DossierBean
{
private String numeroDossier; // PK
private TravailleurHandicapeBean travailleurHandicape; // One-to-one relation
/**
* @return the numeroDossier
*/
public String getNumeroDossier()
{
return numeroDossier;
}
/**
* @param numeroDossier the numeroDossier to set
*/
public void setNumeroDossier(String numeroDossier)
{
this.numeroDossier = numeroDossier;
}
/**
* @return the travailleurHandicape
*/
public TravailleurHandicapeBean getTravailleurHandicape()
{
return travailleurHandicape;
}
/**
* @param travailleurHandicape the travailleurHandicape to set
*/
public void setTravailleurHandicape(TravailleurHandicapeBean travailleurHandicape)
{
this.travailleurHandicape = travailleurHandicape;
}
}
TravailleurHandicapeBean.java(子bean):
@Named("travailleurHandicapeBean")
@Scope("prototype")
public class TravailleurHandicapeBean
{
private String numeroDossier;
private DossierBean dossier;
private Date dateAgrement;
private Integer dureeAgrement;
private Character indicateurRenouv;
/**
* @return the numeroDossier
*/
public String getNumeroDossier()
{
return numeroDossier;
}
/**
* @param numeroDossier the numeroDossier to set
*/
public void setNumeroDossier(String numeroDossier)
{
this.numeroDossier = numeroDossier;
}
/**
* @return the dateAgrement
*/
public Date getDateAgrement()
{
return dateAgrement;
}
/**
* @param dateAgrement the dateAgrement to set
*/
public void setDateAgrement(Date dateAgrement)
{
this.dateAgrement = dateAgrement;
}
/**
* @return the dureeAgrement
*/
public Integer getDureeAgrement()
{
return dureeAgrement;
}
/**
* @param dureeAgrement the dureeAgrement to set
*/
public void setDureeAgrement(Integer dureeAgrement)
{
this.dureeAgrement = dureeAgrement;
}
/**
* @return the indicateurRenouv
*/
public Character getIndicateurRenouv()
{
return indicateurRenouv;
}
/**
* @param indicateurRenouv the indicateurRenouv to set
*/
public void setIndicateurRenouv(Character indicateurRenouv)
{
this.indicateurRenouv = indicateurRenouv;
}
/**
* @return the dossier
*/
public DossierBean getDossier()
{
return dossier;
}
/**
* @param dossier the dossier to set
*/
public void setDossier(DossierBean dossier)
{
this.dossier = dossier;
}
}
谢谢你的帮助!
没有答案吗? 感谢您的贡献...
在Hibernate上查看此错误报告: https : //hibernate.onjira.com/browse/HHH-5267似乎完全是您的问题。 我不确定它是否只影响版本3.5或4.x。
解决方法似乎是在调用session.merge()而不是session.saveOrUpdate()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.