Hibernate Mapping Beispiel?

Romsl

Erfahrenes Mitglied
Hi,

kann mir jemand der es auch versteht mal ein HibernateMapping Beispiel hier mit den dazugehörigen Beans angeben?

Und zwar sollte es folgendes können:

SystemLocale enthält Set an Title, AcademicTitle und Country. Jetzt soll z.B. beim Löschen eines Title die zugehörige SystemLocale nicht gelöscht werden. Aber beim Löschen der SystemLocale sollen alle Title, AcademicTitle und Country cascadierend mitgelöscht werden.

Mein versuch:

SystemLocale:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="ebooking.module.base.bean.system.SystemLocale" table="BASE_SYSTEM_LOCALE">
        <id name="id" type="long">
            <column name="ID" not-null="true"/> 
            <generator class="increment"/>
        </id>

        <property name="key" type="string" unique="true">
            <column name="LOCALE_KEY" not-null="true"/>
        </property>

        <property name="language" type="string">
            <column name="LANGUAGE" not-null="true"/>
        </property>

        <property name="countryName" type="string">
            <column name="COUNTRY_NAME" not-null="true"/>
        </property>

        <set name="titles" table="BASE_SYSTEM_TITLE" inverse="true" cascade="save-update" lazy="true" sort="ebooking.module.base.hbm.HibernateComparator">
            <key column="SYSTEM_LOCALE_KEY" property-ref="key"/>
            <one-to-many class="ebooking.module.base.bean.system.Title"/>
        </set>

        <set name="academicTitles" table="BASE_SYSTEM_ACADEMIC_TITLE" inverse="true" cascade="save-update" lazy="true" sort="ebooking.module.base.hbm.HibernateComparator">
            <key column="SYSTEM_LOCALE_KEY" property-ref="key"/>
            <one-to-many class="ebooking.module.base.bean.system.AcademicTitle"/>
        </set>

        <set name="countries" table="BASE_SYSTEM_COUNTRY" inverse="true" cascade="save-update" lazy="true" sort="ebooking.module.base.hbm.HibernateComparator">
            <key column="SYSTEM_LOCALE_KEY" property-ref="key"/>
            <one-to-many class="ebooking.module.base.bean.system.Country"/>
        </set>
    </class>
</hibernate-mapping>

Title:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="ebooking.module.base.bean.system.Title" table="BASE_SYSTEM_TITLE">
        <id name="id" type="long">
            <column name="ID" not-null="true"/>
            <generator class="increment"/>
        </id>

        <property name="key" type="string">
            <column name="TITLE_KEY" length="100" not-null="true"/>
        </property>

        <property name="name" type="string">
            <column name="NAME" length="100" not-null="true"/>
        </property>

        <many-to-one name="systemLocale" column="SYSTEM_LOCALE_KEY" property-ref="key" class="ebooking.module.base.bean.system.SystemLocale" cascade="save-update" not-null="true"/>
    </class>
</hibernate-mapping>

der Rest ist dito.

Ich bekomm jedesmal eine Exception:

Code:
org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException: deleted object would be re-saved by cascade (remove deleted object from associations): [ebooking.module.base.bean.system.SystemLocale#1]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [ebooking.module.base.bean.system.SystemLocale#1]
	org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:605)
	org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:570)
	org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:482)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:401)
	org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:256)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:67)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
	$Proxy1.deleteSystemLocaleBySystemLocaleKey(Unknown Source)
	ebooking.module.base.controller.SystemLocaleController.deleteSystemLocaleForm(SystemLocaleController.java:79)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:324)
	org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:351)
	org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:305)
	org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:128)
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:675)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:623)
	org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:384)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:344)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

oder irgendetwas mit not owner of session ....
 
Schade, findet sich niemand der mir helfen kann? Es würde mir auch schon ein Beispiel das in diese Richtung geht reichen.

Gruß

Romsl
 
Ich bin bald am Verzweifeln. Ich finde keine Beispiele, das meinem Problem annähernd entspricht.
 
Hallo!

Hast du's schonmal mit
Code:
 <set name="titles" table="BASE_SYSTEM_TITLE" inverse="true" cascade="all" lazy="true" sort="ebooking.module.base.hbm.HibernateComparator">
            <key column="SYSTEM_LOCALE_KEY" property-ref="key"/>
            <one-to-many class="ebooking.module.base.bean.system.Title"/>
        </set>

und
Code:
<many-to-one name="systemLocale" column="SYSTEM_LOCALE_KEY" property-ref="key" class="ebooking.module.base.bean.system.SystemLocale"  not-null="true"/>

versucht?

Gruß Tom
 
Hi Thomas,

ja das habe ich versucht. Aber leider werden nicht alle Title und AcademicTitle aus der Datenbank (die mit dem SystemLocale.key verknüpft sind) gelöscht. Genauer gesagt wird jeweils immer nur einer gelöscht. Sie haben aber alle den selben FK.

Komischerweise funktioniert das ganze mit Country, aber nicht mit Title und AcademicTitle.

Gruß und vielen Dank

Romsl
 
Zuletzt bearbeitet:
Hallo an Alle die mir vergeblich versucht haben zu helfen,

@Thomas: Ich habe zu sort den HibernateComparator verwendet. Aber leider nicht in Title und AcademicTitle das zugehörige interface angegeben.
Hibernate meckert komischerweise nicht.

Gibt es eine angemessene Strafe für ein solch fahrlässiges vergehen?

Danke ihr seid die Besten
 
Zurück