Question

This is my first post and I am new to Hibernate + Spring. I am using XML for Hibernate mapping declaration in my applicationContext.xml file.

Briefly, I am trying to do:

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

With the hope that it will delete the child. But it doesn't work. :(

Instead, I've got this Exception:

Caused by: java.lang.NullPointerException at org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232) at org.hibernate.engine.Cascade.cascade(Cascade.java:161) at org.hibernate.engine.Cascade.cascade(Cascade.java:127) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246) at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722) at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:708) at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705) at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:701) at fr.gouv.travail.gestionAccords.server.dao.implementations.DossierDAOImpl.update(DossierDAOImpl.java:163) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy38.update(Unknown Source) at fr.gouv.travail.gestionAccords.server.business.gestionDossiers.detailsDossier.commons.implementations.DetailsDossierBusinessImpl.update(DetailsDossierBusinessImpl.java:396)

I've seen that I have to declare delete-orphan in my XML mapping file but it's getting me crazy because it doesn't want to work. Could you please have a look at what is wrong?

So, in my current project I have a one-to-one relationship: here is my XML mapping for the parent called 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 (Parent 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;
    }
}

Thanks for your help!

No answers ? Thanks for your contribution...

Was it helpful?

Solution

See this bug report on Hibernate: https://hibernate.onjira.com/browse/HHH-5267 Appears to be exactly your issue. I'm not sure if it only affects version 3.5 or 4.x as well.

Workaround appears to be calling session.merge() instead of session.saveOrUpdate()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top