一对一删除:Hibernate 3 + Spring 3 + PostgreSQL 9.1



这是我的第一篇文章,我是Hibernate + Spring的新手。我在我的applicationContext.xml文件中使用XML进行Hibernate映射声明。

简单地说,我想做的是:

parent.setChild(null);
parentDao.update(parent);

希望它将删除子节点。但这行不通。(

相反,我得到了这个Exception:

由:java.lang.NullPointerException引起org.hibernate.engine.EntityEntry.getLoadedValue (EntityEntry.java: 255)Cascade.java:232org.hibernate.engine.Cascade.cascade (Cascade.java: 161)org.hibernate.engine.Cascade.cascade (Cascade.java: 127)org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate (DefaultSaveOrUpdateEventListener.java: 376)在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate (DefaultSaveOrUpdateEventListener.java: 350)在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached (DefaultSaveOrUpdateEventListener.java: 246)在org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate (DefaultUpdateEventListener.java: 57)在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate (DefaultSaveOrUpdateEventListener.java: 93)org.hibernate.impl.SessionImpl.fireUpdate (SessionImpl.java: 742)(SessionImpl.java:730org.hibernate.impl.SessionImpl.update (SessionImpl.java: 722)org.springframework.orm.hibernate3.HibernateTemplate doinhibernate 14.美元(HibernateTemplate.java: 708)在org.springframework.orm.hibernate3.HibernateTemplate.doExecute (HibernateTemplate.java: 406)在org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession (HibernateTemplate.java: 374)在org.springframework.orm.hibernate3.HibernateTemplate.update (HibernateTemplate.java: 705)在org.springframework.orm.hibernate3.HibernateTemplate.update (HibernateTemplate.java: 701)在fr.gouv.travail.gestionAccords.server.dao.implementations.DossierDAOImpl.update (DossierDAOImpl.java: 163)在sun.reflect.NativeMethodAccessorImpl。invoke0(本机方法)atsun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java: 39)在sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java: 25)(Method.java:597org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java: 318)在org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java: 183)在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java: 150)在org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java: 110)在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java: 172)在org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java: 202)Proxy38美元。更新(未知来源)fr.gouv.travail.gestionAccords.server.business.gestionDossiers.detailsDossier.commons.implementations.DetailsDossierBusinessImpl.update (DetailsDossierBusinessImpl.java: 396)

我看到我必须在我的XML映射文件中声明delete-orphan,但它让我疯狂,因为它不想工作。请您检查一下有什么问题吗?

所以,在我当前的项目中,我有一个一对一的关系:这是我的父元素的XML映射,名为DossierBean

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 (Child 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的bug报告:https://hibernate.onjira.com/browse/HHH-5267看来这正是你的问题。我不确定它是否只影响3.5或4版本。

解决方法似乎正在调用session.merge()而不是session.saveOrUpdate()

最新更新