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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate - объект который повторяется..... ... в сложном объекте несколько раз 
V
    Опции темы
firedrago
Дата 4.9.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет,
вот сново столкнулся с проблемой и очень прошу о помощи.......

есть ряд самостоятельных объектов B и C, и объект А который объединяет объекты B и С. B и С могут быть null. Объект X - это некий item который может быть только в оном экземпляре в Sete.  Для дальнешего понимания -  Hibernate Session -только одна через pool.


Код

    public class A {
        public String id="";
        public B b;
        public C c;
    }
    
    public class B {
        public String id="";
        public Set<X> items = new HashSet<X>();
    }
    
    public class C {
        public String id="";
        public Set<X> items = new HashSet<X>();
    }    

    public class X {
        public String id="";
        public boolean value;
    }


Код

<hibernate-mapping>
    <class name="A" table="TABLE_A">
        <id name="id" column="ID" type="string" length="32">
            <generator class="uuid" />
        </id>
        <many-to-one name="b" class="B" column="B_ID" unique="true" cascade="all"/>
        <many-to-one name="c" class="C" column="C_ID" unique="true" cascade="all"/>
    </class>
    <class name="B" table="TABLE_B">
        <id name="id" column="ID" type="string" length="32">
            <generator class="uuid" />
        </id>
            <many-to-one name="items" class="X" column="X_ID"/>
    </class>
    <class name="C" table="TABLE_C">
        <id name="id" column="ID" type="string" length="32">
            <generator class="uuid" />
        </id>
            <many-to-one name="items" class="X" column="X_ID"/>
    </class>

    <class name="X" table="TABLE_X" polymorphism="implicit">
        <id name="id" column="ID" type="string" length="32">
            <generator class="uuid" />
        </id>
        <property name="value" type="boolean" column="VALUE" />
    </class>
</hibernate-mapping>



Теперь следующий сценарий -

шаг 1)
есть объект B 
B->items->X->id = 1
B->items->X->value = true

B->items->X->id = 2
B->items->X->value = false

B->items->X->id = 3
B->items->X->value = true

он создан - записан в базу - все ок

шаг 2)
создаем объект А
A->id =1
добовляем в него объект В
записываем -> все ок

шаг 3)
вытаскиваем объект А
session.load(A.class, "1") - все ок
а теперь самое интересное - 
надо создать объект С
добавить в него все объекты Х из объекта В где value = true ( id = "1" и "3")

вариант:
Код

C c= new C();
for(Iterator<X> it=a.b.items.iterator(); it.hasNext();){
    X item = it.next();
    if(item.value){
        c.items.add(item);
    }
}
a.c=c;
session.update(a);

кречит что объект уже ассоциирован с этой сессией и естественно не работает

вариант:
C c= new C();
Код

for(Iterator<X> it=a.b.items.iterator(); it.hasNext();){
    X item = it.next();
    if(item.value){
        c.items.add(item);
    }
}
session.add(c);
a.c=c;
session.update(a);

кречит что объект с is dirty........

как сделать с двумя сессиями я знаю....но в моем случае вторую сессию очень сложно сделать...
где-то вычитал что как-то через session.merge() сделать можно - но как что-то я понять не могу как merge() правильно пользоваться.....

ну вобщем вот и вопрос - как это сделать с одной сессией.......

зарание благодарен!






Это сообщение отредактировал(а) firedrago - 4.9.2007, 23:13
PM MAIL   Вверх
firedrago
Дата 6.9.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



неужели никто не сталкивался ?!

все идеи ОЧЕНЬ приветствуются!


PM MAIL   Вверх
Aoli
Дата 6.9.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



А что говорит если писать так:
Код

C c= new C();
session.save(c); // строчка 234
for(Iterator<X> it=a.b.items.iterator(); it.hasNext();){
    X item = it.next();
    if(item.value){
        c.items.add(item);
    }
}
//session.save(c);// как вариант, если строчка 234 не прокатит.
a.c=c;
session.flush();

PM WWW ICQ   Вверх
firedrago
Дата 7.9.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



спасибо,
я разобрался - причины у меня как выяснилось - 2
1. надо больше спать...
2. быть более внимательным...

а если серъезно то
1.  в вышеприведенном примере в строке
 <many-to-one name="items" class="X" column="X_ID"/>
надо было бы указать правильный cascade
2. в моем приложении не был инициализирован Set, тоесть как в примере
(Set<X> items = new HashSet<X>();) new HashSet не был вписан..... 
что мне не очень понравилось hibernate не выдал никаких exception..... 

а так всем спасибо за внимание!


Это сообщение отредактировал(а) firedrago - 7.9.2007, 15:53
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.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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