Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate - объект который повторяется.....


Автор: firedrago 4.9.2007, 23:13
Всем привет,
вот сново столкнулся с проблемой и очень прошу о помощи.......

есть ряд самостоятельных объектов 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 6.9.2007, 17:18
неужели никто не сталкивался ?!

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


Автор: Aoli 6.9.2007, 23:43
А что говорит если писать так:
Код

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();

Автор: firedrago 7.9.2007, 15:52
спасибо,
я разобрался - причины у меня как выяснилось - 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..... 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)