Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Каскадное удаление в Hibernate, связь many-to-one, Не работает удаление в Hibernanate 
V
    Опции темы
Quester82
Дата 12.10.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
garbuz
Дата 12.10.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



По маппингам вроде все нормально, хотя советую посмотрите главу 6 из Java Persistence with Hibernate, может что-то упустили.
Попробуйте еще так
Код

 Object person =  ses.get(Person.class, idPerson);

PM MAIL   Вверх
Quester82
Дата 12.10.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Цитата(garbuz @ 12.10.2009,  12:25)
По маппингам вроде все нормально, хотя советую посмотрите главу 6 из Java Persistence with Hibernate, может что-то упустили.
Попробуйте еще так
Код

 Object person =  ses.get(Person.class, idPerson);

Спасибо за наводку на книгу - почитаю. 
Вот это...
 
Код

 Object person =  ses.get(Person.class, idPerson);

...не помогает, да и не может помочь, насколько я понимаю. Проблема в другом.

Коллекция которая в маппинге Person описана тянется лениво.
Get и load возврящают для этого списка заглушку, которая инициализируется тольои явном обращении к экземпляру класса.

Есть пара идей.

Проверю - напишу...

Но вопрос всё равно остаётся открытым...

Это сообщение отредактировал(а) Quester82 - 12.10.2009, 13:20
PM MAIL   Вверх
Quester82
Дата 16.10.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Цитата(Quester82 @ 12.10.2009,  12:44)
Цитата(garbuz @ 12.10.2009,  12:25)
По маппингам вроде все нормально, хотя советую посмотрите главу 6 из Java Persistence with Hibernate, может что-то упустили.
Попробуйте еще так
Код

 Object person =  ses.get(Person.class, idPerson);

Спасибо за наводку на книгу - почитаю. 
Вот это...
 
Код

 Object person =  ses.get(Person.class, idPerson);

...не помогает, да и не может помочь, насколько я понимаю. Проблема в другом.

Коллекция которая в маппинге Person описана тянется лениво.
Get и load возврящают для этого списка заглушку, которая инициализируется тольои явном обращении к экземпляру класса.

Есть пара идей.

Проверю - напишу...

Но вопрос всё равно остаётся открытым...

Проблема решена, спасибо за внимание всем кто проявил внимание...
PM MAIL   Вверх
garbuz
Дата 16.10.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(Quester82 @  16.10.2009,  09:03 Найти цитируемый пост)
Проблема решена, спасибо за внимание всем кто проявил внимание... 

Принято писать решение.
PM MAIL   Вверх
Quester82
Дата 16.10.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Обязательно напишу... но чуть позднее...
PM MAIL   Вверх
Quester82
Дата 16.10.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



И решение задачи...

Да, в общем проблема оказалась занятная...
и состояла вот в чём:

У меня в базовом классе для POJO в реализации метода hashCode() было вот что:


Код

public class BaseObject implements Serializable 
{
    /*Переменная добавлена, чтобы в дальнейшем не было проблем с сериализацеией
    Pojo объектов. ID сгенерировал через инструмент 
    serialver edu.khai.teachingstaff.model.BaseObject*/
    static final long serialVersionUID = 877732201653021612L;
    
    public String toString() {
        return ToStringBuilder.reflectionToString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }

    public boolean equals(Object o) {
        return EqualsBuilder.reflectionEquals(this, o);
    }

    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }
}


Ничего не напрягает в этом коде, нет?

Вот и мне казалось что всё ок, до тех пор, пока ленивая коллекция не пыталась сгенерировать себе hashCode. Hibernate возаращает заглушку, а не реальный объект и hashCode() вызывал исключение на ленивой коллекции.

Ошибка приблизительно так выглядела:
Код

Caused by: net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection
at net.sf.hibernate.collection.PersistentCollection.initialize(PersistentCollection.java:206)
at net.sf.hibernate.collection.PersistentCollection.read(PersistentCollection.java:71)
at net.sf.hibernate.collection.Set.hashCode(Set.java:384)
at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:297)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:270)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:200)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:177)


В общем теперь по умному реализовал hashCode() и equals() в классах POJO.

Вроде пока работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0666 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.