
Новичок
Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.10.2009
Репутация: нет Всего: нет
|
Проблема следующая. Не работает каскадное удаление в Hibernate, для связи one-to-many. Для работы с Hibernate используется org.springframework.orm.hibernate3.support.HibernateDaoSupport Файлы маппинга следующие: '''Person.hbm.xml'''{{{ | Код | <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="edu.khai.teachingstaff.model"> <class name="Person" table="TS_PERSON" where="id_person > 16710"> <id name="idPerson" column="ID_PERSON"> <generator class="increment"> <!--<param name="sequence">CT_PERSON_SEQ</param>--> </generator> </id>
<property name="lastNameUkr" column="LAST_NAME_UKR" /> <property name="nameUkr" column="NAME_UKR" /> <property name="secondNameUkr" column="SECOND_NAME_UKR" /> <property name="birthDate" column="BIRTH_DATE" type="calendar" /> <set name="scientificDegrees" cascade="delete" inverse="true" > <key column="FK_ID_PERSON"/> <one-to-many class="ScientificDegree"/> </set>
</class> </hibernate-mapping>
|
'''ScientificDegree.hbm.xml'''| Код | <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="edu.khai.teachingstaff.model"> <class name="ScientificDegree" table="TS_SCIENTIFIC_DEGREE"> <id name="idScientificDegree" column="ID_SCIENTIFIC_DEGREE"> <generator class="increment"> <!--<param name="sequence">TS_DICT_SCIENTIFIC_DEGREE_SEQ</param>--> </generator> </id> <property name="sdDiplomNumber" column="SD_DIPLOM_NUMBER"/> <property name="sdDiplomDate" column="SD_DIPLOM_DATE"/> <many-to-one name="person" class="Person" column="FK_ID_PERSON" not-null="true" /> </class> </hibernate-mapping>
|
Код удаления: в '''PersonDAOHibernate.java'''| Код | package edu.khai.teachingstaff.dao.hibernate;
import org.hibernate.Session;
/*Java native imports*/ import java.util.List; import java.util.Vector;
/*Spring imports*/ import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
/*DAO import*/ import edu.khai.teachingstaff.dao.PersonDAO; /*Model import*/ import edu.khai.teachingstaff.model.Person;
public class PersonDAOHibernate extends HibernateDaoSupport implements PersonDAO { ******* public void removePerson(Long idPerson){
Session ses = getSession(); ses.beginTransaction(); Object person = ses.load(Person.class, idPerson); /*Это заглушка, необходимая для каскадного удаления. Если убрать комментарий, удаление заработает потому как класс Person инициализирует ленивую коллекцию, необходимую для удаления. Сейчас каскадное удаление не работает и вылетает с ошибкой! // person.toString(); */ ses.delete(person); ses.getTransaction().commit(); /* //Старый код удаления записи. В принципе тоже работает //но этот метод успевает открыть и закрыть, по ходу дела 2 сессии //пусть пока полежит тут, разберусь с каскадным удалением, //и этот код скорее всего уйдёт. Object person = getHibernateTemplate().load(Person.class, idPerson); getHibernateTemplate().delete(person); */
} }
|
Лог ошибки| Код | Testsuite: edu.khai.teachingstaff.dao.ScientificDegreeDAOTest Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 1,078 sec ------------- Standard Output --------------- [INFO] [org.springframework.orm.hibernate3.LocalSessionFactoryBean] - Building new Hibernate SessionFactory :: [2009-10-12 10:39:01,640] [0] [main] [WARN] [net.sf.ehcache.config.Configurator] - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/D:/Quester/java/teachingstaff/Branch-ver.0000003/lib/ehcache-1.1.jar!/ehcache-failsafe.xml :: [2009-10-12 10:39:02,500] [860] [main] [INFO] [org.springframework.orm.hibernate3.HibernateTransactionManager] - Using DataSource [org.springframework.jdbc.datasource.DriverManagerDataSource@1283052] of Hibernate SessionFactory for HibernateTransactionManager :: [2009-10-12 10:39:03,437] [1797] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Opening Hibernate Session :: [2009-10-12 10:39:04,406] [2766] [main] [DEBUG] [org.hibernate.SQL] - select max(ID_PERSON) from TS_PERSON :: [2009-10-12 10:39:04,546] [2906] [main] Hibernate: select max(ID_PERSON) from TS_PERSON [DEBUG] [org.springframework.orm.hibernate3.HibernateTemplate] - Eagerly flushing Hibernate session :: [2009-10-12 10:39:04,671] [3031] [main] [DEBUG] [org.hibernate.SQL] - insert into TS_PERSON (LAST_NAME_UKR, NAME_UKR, SECOND_NAME_UKR, BIRTH_DATE, ID_PERSON) values (?, ?, ?, ?, ?) :: [2009-10-12 10:39:04,687] [3047] [main] Hibernate: insert into TS_PERSON (LAST_NAME_UKR, NAME_UKR, SECOND_NAME_UKR, BIRTH_DATE, ID_PERSON) values (?, ?, ?, ?, ?) [DEBUG] [org.hibernate.type.StringType] - binding 'TestLastNameUkr' to parameter: 1 :: [2009-10-12 10:39:04,687] [3047] [main] [DEBUG] [org.hibernate.type.StringType] - binding 'TestNameUkr' to parameter: 2 :: [2009-10-12 10:39:04,703] [3063] [main] [DEBUG] [org.hibernate.type.StringType] - binding 'TestSecondNameUkr' to parameter: 3 :: [2009-10-12 10:39:04,703] [3063] [main] [DEBUG] [org.hibernate.type.CalendarType] - binding '2000-02-01 00:00:00' to parameter: 4 :: [2009-10-12 10:39:04,718] [3078] [main] [DEBUG] [org.hibernate.type.LongType] - binding '16779' to parameter: 5 :: [2009-10-12 10:39:04,718] [3078] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Closing Hibernate Session :: [2009-10-12 10:39:04,734] [3094] [main] [DEBUG] [edu.khai.teachingstaff.dao.hibernate.PersonDAOHibernate] - idPerson set to :: 16779 :: [2009-10-12 10:39:04,734] [3094] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Opening Hibernate Session :: [2009-10-12 10:39:04,750] [3110] [main] [DEBUG] [org.hibernate.SQL] - select max(ID_SCIENTIFIC_DEGREE) from TS_SCIENTIFIC_DEGREE :: [2009-10-12 10:39:04,765] [3125] [main] Hibernate: select max(ID_SCIENTIFIC_DEGREE) from TS_SCIENTIFIC_DEGREE [DEBUG] [org.springframework.orm.hibernate3.HibernateTemplate] - Eagerly flushing Hibernate session :: [2009-10-12 10:39:04,781] [3141] [main] [DEBUG] [org.hibernate.SQL] - insert into TS_SCIENTIFIC_DEGREE (SD_DIPLOM_NUMBER, SD_DIPLOM_DATE, FK_ID_PERSON, ID_SCIENTIFIC_DEGREE) values (?, ?, ?, ?) :: [2009-10-12 10:39:04,781] [3141] [main] Hibernate: insert into TS_SCIENTIFIC_DEGREE (SD_DIPLOM_NUMBER, SD_DIPLOM_DATE, FK_ID_PERSON, ID_SCIENTIFIC_DEGREE) values (?, ?, ?, ?) [DEBUG] [org.hibernate.type.StringType] - binding 'TestSDDiplomNmber' to parameter: 1 :: [2009-10-12 10:39:04,781] [3141] [main] [DEBUG] [org.hibernate.type.CalendarType] - binding '2000-02-01 00:00:00' to parameter: 2 :: [2009-10-12 10:39:04,781] [3141] [main] [DEBUG] [org.hibernate.type.LongType] - binding '16779' to parameter: 3 :: [2009-10-12 10:39:04,781] [3141] [main] [DEBUG] [org.hibernate.type.LongType] - binding '1' to parameter: 4 :: [2009-10-12 10:39:04,796] [3156] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Closing Hibernate Session :: [2009-10-12 10:39:04,796] [3156] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Opening Hibernate Session :: [2009-10-12 10:39:04,796] [3156] [main] [DEBUG] [org.springframework.orm.hibernate3.HibernateTemplate] - Eagerly flushing Hibernate session :: [2009-10-12 10:39:04,796] [3156] [main] [DEBUG] [org.hibernate.SQL] - update TS_SCIENTIFIC_DEGREE set SD_DIPLOM_NUMBER=?, SD_DIPLOM_DATE=?, FK_ID_PERSON=? where ID_SCIENTIFIC_DEGREE=? :: [2009-10-12 10:39:04,828] [3188] [main] Hibernate: update TS_SCIENTIFIC_DEGREE set SD_DIPLOM_NUMBER=?, SD_DIPLOM_DATE=?, FK_ID_PERSON=? where ID_SCIENTIFIC_DEGREE=? [DEBUG] [org.hibernate.type.StringType] - binding 'TestSDDiplomNmberEdited' to parameter: 1 :: [2009-10-12 10:39:04,828] [3188] [main] [DEBUG] [org.hibernate.type.CalendarType] - binding '2000-02-01 00:00:00' to parameter: 2 :: [2009-10-12 10:39:04,843] [3203] [main] [DEBUG] [org.hibernate.type.LongType] - binding '16779' to parameter: 3 :: [2009-10-12 10:39:04,843] [3203] [main] [DEBUG] [org.hibernate.type.LongType] - binding '1' to parameter: 4 :: [2009-10-12 10:39:04,843] [3203] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Closing Hibernate Session :: [2009-10-12 10:39:04,843] [3203] [main] [INFO] [edu.khai.teachingstaff.dao.ScientificDegreeDAOTest] - edu.khai.teachingstaff.model.Person@2d59a3[ idPerson=16779 lastNameUkr=TestLastNameUkr nameUkr=TestNameUkr secondNameUkr=TestSecondNameUkr birthDate=java.util.GregorianCalendar[time=949352400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=3600000,useDaylight=true,transitions=130,lastRule=java.util.SimpleTimeZone[id=Europe/Moscow,offset=10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2000,MONTH=1,WEEK_OF_YEAR=6,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=10800000,DST_OFFSET=0] scientificDegrees=[edu.khai.teachingstaff.model.ScientificDegree@88b1e6[ idScientificDegree=1 sdDiplomNumber=TestSDDiplomNmberEdited sdDiplomDate=java.util.GregorianCalendar[time=949352400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=3600000,useDaylight=true,transitions=130,lastRule=java.util.SimpleTimeZone[id=Europe/Moscow,offset=10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2000,MONTH=1,WEEK_OF_YEAR=6,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=10800000,DST_OFFSET=0] person=edu.khai.teachingstaff.model.Person@2d59a3 ]] ] :: [2009-10-12 10:39:04,859] [3219] [main] [INFO] [edu.khai.teachingstaff.dao.ScientificDegreeDAOTest] - edu.khai.teachingstaff.model.ScientificDegree@88b1e6[ idScientificDegree=1 sdDiplomNumber=TestSDDiplomNmberEdited sdDiplomDate=java.util.GregorianCalendar[time=949352400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=3600000,useDaylight=true,transitions=130,lastRule=java.util.SimpleTimeZone[id=Europe/Moscow,offset=10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2000,MONTH=1,WEEK_OF_YEAR=6,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=10800000,DST_OFFSET=0] person=edu.khai.teachingstaff.model.Person@2d59a3[ idPerson=16779 lastNameUkr=TestLastNameUkr nameUkr=TestNameUkr secondNameUkr=TestSecondNameUkr birthDate=java.util.GregorianCalendar[time=949352400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=3600000,useDaylight=true,transitions=130,lastRule=java.util.SimpleTimeZone[id=Europe/Moscow,offset=10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2000,MONTH=1,WEEK_OF_YEAR=6,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=10800000,DST_OFFSET=0] scientificDegrees=[edu.khai.teachingstaff.model.ScientificDegree@88b1e6[ idScientificDegree=1 sdDiplomNumber=TestSDDiplomNmberEdited sdDiplomDate=java.util.GregorianCalendar[time=949352400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=3600000,useDaylight=true,transitions=130,lastRule=java.util.SimpleTimeZone[id=Europe/Moscow,offset=10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2000,MONTH=1,WEEK_OF_YEAR=6,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=10800000,DST_OFFSET=0] person=edu.khai.teachingstaff.model.Person@2d59a3 ]] ] ] :: [2009-10-12 10:39:04,890] [3250] [main] [DEBUG] [org.springframework.orm.hibernate3.SessionFactoryUtils] - Opening Hibernate Session :: [2009-10-12 10:39:04,921] [3281] [main] [DEBUG] [org.hibernate.SQL] - select person0_.ID_PERSON as ID1_2_0_, person0_.LAST_NAME_UKR as LAST2_2_0_, person0_.NAME_UKR as NAME3_2_0_, person0_.SECOND_NAME_UKR as SECOND4_2_0_, person0_.BIRTH_DATE as BIRTH5_2_0_ from TS_PERSON person0_ where person0_.ID_PERSON=? and person0_.id_person > 16710 :: [2009-10-12 10:39:05,031] [3391] [main] Hibernate: select person0_.ID_PERSON as ID1_2_0_, person0_.LAST_NAME_UKR as LAST2_2_0_, person0_.NAME_UKR as NAME3_2_0_, person0_.SECOND_NAME_UKR as SECOND4_2_0_, person0_.BIRTH_DATE as BIRTH5_2_0_ from TS_PERSON person0_ where person0_.ID_PERSON=? and person0_.id_person > 16710 [DEBUG] [org.hibernate.type.LongType] - binding '16779' to parameter: 1 :: [2009-10-12 10:39:05,031] [3391] [main] [DEBUG] [org.hibernate.type.StringType] - returning 'TestLastNameUkr' as column: LAST2_2_0_ :: [2009-10-12 10:39:05,046] [3406] [main] [DEBUG] [org.hibernate.type.StringType] - returning 'TestNameUkr' as column: NAME3_2_0_ :: [2009-10-12 10:39:05,046] [3406] [main] [DEBUG] [org.hibernate.type.StringType] - returning 'TestSecondNameUkr' as column: SECOND4_2_0_ :: [2009-10-12 10:39:05,046] [3406] [main] [DEBUG] [org.hibernate.type.CalendarType] - returning '2000-02-01 00:00:00' as column: BIRTH5_2_0_ :: [2009-10-12 10:39:05,046] [3406] [main] [DEBUG] [org.hibernate.SQL] - select scientific0_.FK_ID_PERSON as FK4_1_, scientific0_.ID_SCIENTIFIC_DEGREE as ID1_1_, scientific0_.ID_SCIENTIFIC_DEGREE as ID1_3_0_, scientific0_.SD_DIPLOM_NUMBER as SD2_3_0_, scientific0_.SD_DIPLOM_DATE as SD3_3_0_, scientific0_.FK_ID_PERSON as FK4_3_0_ from TS_SCIENTIFIC_DEGREE scientific0_ where scientific0_.FK_ID_PERSON=? :: [2009-10-12 10:39:05,062] [3422] [main] Hibernate: select scientific0_.FK_ID_PERSON as FK4_1_, scientific0_.ID_SCIENTIFIC_DEGREE as ID1_1_, scientific0_.ID_SCIENTIFIC_DEGREE as ID1_3_0_, scientific0_.SD_DIPLOM_NUMBER as SD2_3_0_, scientific0_.SD_DIPLOM_DATE as SD3_3_0_, scientific0_.FK_ID_PERSON as FK4_3_0_ from TS_SCIENTIFIC_DEGREE scientific0_ where scientific0_.FK_ID_PERSON=? [DEBUG] [org.hibernate.type.LongType] - binding '16779' to parameter: 1 :: [2009-10-12 10:39:05,078] [3438] [main] [DEBUG] [org.hibernate.type.LongType] - returning '1' as column: ID1_3_0_ :: [2009-10-12 10:39:05,078] [3438] [main] [DEBUG] [org.hibernate.type.StringType] - returning 'TestSDDiplomNmberEdited' as column: SD2_3_0_ :: [2009-10-12 10:39:05,078] [3438] [main] [DEBUG] [org.hibernate.type.CalendarType] - returning '2000-02-01 00:00:00' as column: SD3_3_0_ :: [2009-10-12 10:39:05,078] [3438] [main] [DEBUG] [org.hibernate.type.LongType] - returning '16779' as column: FK4_3_0_ :: [2009-10-12 10:39:05,078] [3438] [main] [DEBUG] [org.hibernate.type.LongType] - returning '16779' as column: FK4_1_ :: [2009-10-12 10:39:05,078] [3438] [main] [DEBUG] [org.hibernate.type.LongType] - returning '1' as column: ID1_1_ :: [2009-10-12 10:39:05,093] [3453] [main] [ERROR] [org.hibernate.LazyInitializationException] - illegal access to loading collection :: [2009-10-12 10:39:05,093] [3453] [main] org.hibernate.LazyInitializationException: illegal access to loading collection
|
Проблема в принципе следующая. Есть желание правильно реализовать каскадное удаление, и в принципе, что интересно, оно таки работает, но через указанную в коде заглушку, а это чит какой-то, что лично мне не очень нравится. Настраивать fetch так, чтобы в коллекцию тянулись всё значения из коллекции нежелательно, так как в коллекции может быть обалденное количество записей. Понимаю, что задача тривиальная, но всё таки какие есть грамотные варианты решения такой проблемы. Это сообщение отредактировал(а) Quester82 - 12.10.2009, 11:46
|