Удалить один к одному: Hibernate 3 + Spring 3 + PostgreSQL 9.1

Это мой первый пост, и я новичок в Hibernate + Spring. Я использую XML для объявления сопоставления Hibernate в моем файле applicationContext.xml.

Вкратце, я пытаюсь сделать:

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

С надеждой, что он удалит ребенка. Но это не работает. :(

Вместо этого у меня есть это исключение:

Я видел, что мне нужно объявить delete-orphan в моем файле сопоставления XML, но это сводит меня с ума, потому что оно не хочет работать. Не могли бы вы посмотреть, что не так?

Итак, в моем текущем проекте у меня отношение один к одному: вот мое XML-сопоставление для родителя с именем DossierBean.

DossierBean.hbm.xml

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.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>

DossierBean.java (родительский компонент) :

<?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>

TravailleurHandicapeBean.java (дочерний компонент):

@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;
    }
}

Спасибо за вашу помощь!

@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.


person Jdaydai    schedule 13.01.2013    source источник


Ответы (1)


Обходной путь, по-видимому, вызывает session.merge() вместо session.saveOrUpdate().

Это точно моя проблема. Спасибо за помощь. Наконец-то я нашел обходной путь: удалите все дочерние TravailleurHandicapeBean и сохраните все новые TravailleurHandicapeBean, которые присутствуют в родительском. :)

person Andrei Socaciu    schedule 14.01.2013
comment
Вызвано: java.lang.NullPointerException в org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255) в org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232) в org.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) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246) at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:246) 57) в org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) в org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742) в org.hibernate.impl.SessionImpl.update(SessionImpl.java:730) в org.hibernate.impl.SessionImpl.update(SessionImpl.java:722) в org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(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(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav a:25) в java.lang.reflect.Method.invoke(Method.java:597) в org.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.update(неизвестный источник) в fr.gouv.travail.gestionAccords.server.business .gestionDossiers.detailsDossier.commons.implementations.DetailsDossierBusinessImpl.update(DetailsDossierBusinessImpl.java:396) - person Jdaydai; 27.01.2013