Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

JPA+hibernate dlaczego hibernate czasem tworzy kolekcje a czasem nie?

20 views
Skip to first unread message

kamiseq

unread,
Dec 28, 2009, 11:39:02 AM12/28/09
to
mam takie szybkie pytanie, może zle szukam ale nie potrafie znalesc
odpowiedzi.

wygenerowałem entity na podstawie bazy danych i jedna entity jest
polaczona z inna np jako one-to-many co tworzy mi kolekcje w jednej z
połączonych klas. teraz kiedy poprzez EM wyszukuje ta instancje
(metoda find) obiekt ma zainicjalizowaną kolekcje - nawet jeśli jest
pusta (tzn referencja wskazuje na nie nullowy obiekt). jeśli natomiast
właśnie utworzyłem obiekt i wywołuję persist to hibernate nie tworzy
mi tej kolekcji (merge tez nie!) co powoduje ze muszę się o wiele
więcej opisać aby sprawdzić czy kolekcja już istnieje.

czy jest jakieś ustawienie które mogę zastosować, aby hibernate
domyślnie inicjalizował kolekcje??

druga sprawa to moja kolekcja jest typu Set<E>, a hibernate używa
PersistentSet który przykrywa HashSet, w takim razie nie mogę użyć
TreeSet aby zachować kolejność elementów nie mówiąc już o tym ze
PersistentSet należny do Hibernata a skoro używam JPA to nie chce
polegać na niestandardowych rozwiązaniach. tak wiec odpada domyślne
tworzenie kolekcji zaraz po utworzeniu obiektu Entity.

w takim razie jak ugryźć ten problem??

Brzezi

unread,
Dec 28, 2009, 11:50:19 AM12/28/09
to
pon, 28 gru 2009 o 17:39 GMT, kamiseq napisaďż˝(a):

> wygenerowa�em entity na podstawie bazy danych i jedna entity jest


> polaczona z inna np jako one-to-many co tworzy mi kolekcje w jednej z

> po��czonych klas. teraz kiedy poprzez EM wyszukuje ta instancje
> (metoda find) obiekt ma zainicjalizowan� kolekcje - nawet je�li jest
> pusta (tzn referencja wskazuje na nie nullowy obiekt). je�li natomiast
> w�a�nie utworzy�em obiekt i wywo�uj� persist to hibernate nie tworzy
> mi tej kolekcji (merge tez nie!) co powoduje ze muszďż˝ siďż˝ o wiele
> wi�cej opisa� aby sprawdzi� czy kolekcja ju� istnieje.

zrob sobie:

private Set<E> mojSet = new HashSet<E>();

> czy jest jakie� ustawienie kt�re mog� zastosowa�, aby hibernate
> domy�lnie inicjalizowa� kolekcje??

jw.

>
> druga sprawa to moja kolekcja jest typu Set<E>, a hibernate u�ywa
> PersistentSet kt�ry przykrywa HashSet, w takim razie nie mog� u�y�
> TreeSet aby zachowa� kolejno�� element�w nie m�wi�c ju� o tym ze
> PersistentSet nale�ny do Hibernata a skoro u�ywam JPA to nie chce
> polega� na niestandardowych rozwi�zaniach. tak wiec odpada domy�lne


> tworzenie kolekcji zaraz po utworzeniu obiektu Entity.

> w takim razie jak ugry�� ten problem??

Zamapuj w hibernate jako kolekcje posortowana, wtedy bedzie uzyta
SortedSet


Pozdrawiam
Brzezi

MZ

unread,
Dec 28, 2009, 11:51:39 AM12/28/09
to
kamiseq pisze:

> czy jest jakie� ustawienie kt�re mog� zastosowa�, aby hibernate
> domy�lnie inicjalizowa� kolekcje??

nie

> druga sprawa to moja kolekcja jest typu Set<E>, a hibernate u�ywa
> PersistentSet kt�ry przykrywa HashSet, w takim razie nie mog� u�y�
> TreeSet aby zachowa� kolejno�� element�w

mo�esz, u�yj TreeSet<E>

> tak wiec odpada domy�lne

> tworzenie kolekcji zaraz po utworzeniu obiektu Entity.

??

> w takim razie jak ugry�� ten problem??

jaki problem?

--
Pozdrawiam
Mateusz
http://na-jawie.blogspot.com

kamiseq

unread,
Dec 29, 2009, 5:07:11 AM12/29/09
to
>
> Zamapuj w hibernate jako kolekcje posortowana, wtedy bedzie uzyta
> SortedSet

a mozesz to jakos rozwinac? pozatym uzywam JPA a nie czystego
hibernata..


Jarek

unread,
Dec 29, 2009, 7:17:23 AM12/29/09
to

"kamiseq" <kam...@gmail.com> wrote in message
news:f2be817d-2afe-40b0...@a6g2000yqm.googlegroups.com...

Pytanie brzmi nie czy uzywasz czystego hibernate czy JPA, tylko czy uzywasz
czystego JPA (np. zeby bardzo teoretycznie mozna bylo p�zniej podmienic
providera) czy dopuszczasz dodatkowe uzycie specyficznych dla hibernate
adnotacji.

Jezeli dopuszczasz, to sp�jrz tutaj na adnotacje @Sort:
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-enhance

Jezeli chcesz czysty JPA to, z tego co wiem, sie nie da. Pozostaje ci
adnotacja @OrderBy, kt�ra dziala jednak inaczej - kolekcja jest po prostu
sortowana przez baze danych podczas pobierania.

Jako ciekawostke dodam, ze np. OpenJPA jest sprytniejszy i wykrywa jaka
implementacje masz uzyta dla danego pola. Jezeli bedziesz mial np.:

private Set<JakasEncja> kolekcja = new TreeSet<JakasEncja>(new
JakisKomparator());

to mimo, ze OpenJPA (tak samo jak hibernate) i tak podstawi swoja
implementacje, to uwzgledni tam ten Tw�j komparator.

Pozdrawiam
Jarek

kamiseq

unread,
Dec 29, 2009, 8:17:23 AM12/29/09
to
> > a mozesz to jakos rozwinac? pozatym uzywam JPA a nie czystego
> > hibernata..

dokladnie chodziło mi ze chce pozostac w czystej implementacji JPA.
ale im dalej w las widze ze coraz wiecej przydatnych ficzerow nie
zostalo zaimplementowane w JPA jako adnotacje i trzeba sie posilkowac
np dodatkowymi zapytaniami.

> Jezeli chcesz czysty JPA to, z tego co wiem, sie nie da. Pozostaje ci

> adnotacja @OrderBy, która dziala jednak inaczej - kolekcja jest po prostu


> sortowana przez baze danych podczas pobierania.

ale nawet uzycie @orderBy nic nie daje poniewaz gdy wymusze typ
kolekcji
@OrderBy
private SortedSet<GenObjectCfg> objectsCfgSet = new
TreeSet<GenObjectCfg>();

hibernate sie wywala z bledem ze brakuje adnotacji @Sort (ktorej nie
ma w JPA), z drugiej strony jesli zadeklaruje kolekcje jako
@OrderBy
private Set<GenObjectCfg> objectsCfgSet = new TreeSet<GenObjectCfg>();

zostaje zgloszony wyjatek
java.lang.ClassCastException: org.hibernate.collection.PersistentSet
cannot be cast to java.util.SortedSet

wiec troche nie rozumiem poprzednich postow mowiacych ze nie ma
problemu. skoro chcialbym miec posortowana kolekcje a hibernate uzywa
HashSet ktory nie gwarantuje ze elementy beda posortowane, a
zadeklarowanie kolekcji z innym typem wywala bledy, tak wiec to jest
jakis problem z ktorym nie potrafie sobie poradzic.

wyjscie z sytuacji jakie widze to zastosowac List zamiast Set (tylko
ze znowu posiadajac kolekcje typu List i FetchType.EAGER JPA znosu sie
wysypie kiedy bede chial poprac kolekcje obniektow ktore zawieraja
kolekcje obiektow..)

dobrze kombinuje? czy moge jakos zmusic JPA aby poprawnie tworzyla
odpowiednie kolekcje (jako SortedSet)

Witold Szczerba

unread,
Dec 29, 2009, 11:20:53 AM12/29/09
to
On Dec 29, 2:17 pm, kamiseq <kami...@gmail.com> wrote:
[...]

> ale nawet uzycie @orderBy nic nie daje poniewaz gdy wymusze typ
> kolekcji
> @OrderBy
> private SortedSet<GenObjectCfg> objectsCfgSet = new
> TreeSet<GenObjectCfg>();
>

Cytat ze specyfikacji JPA (ejb-3_0-fr-spec-persistence) ze strony:
http://jcp.org/en/jsr/detail?id=220

Collection-valued persistent fields and properties must be defined in
terms of one of the following col-
lection-valued interfaces regardless of whether the entity class
otherwise adheres to the JavaBeans
method conventions noted above and whether field or property-based
access is used:
java.util.Collection, java.util.Set, java.util.List[4], java.util.Map.
[5]

[4] Portable applications should not expect the order of lists to be
maintained across persistence contexts unless the OrderBy construct is
used and the modifications to the list observe the specified ordering.
The order is not otherwise persistent.
[5] The implementation type may be used by the application to
initialize fields or properties before the entity is made persistent;
subsequent access must be through the interface type once the entity
becomes managed (or detached).

Może po prostu spróbuj z Collection albo List zamiast Set. Nie opisuj
adnotacjami JPA implementacji tylko wskazane interfejsy.

kamiseq

unread,
Dec 29, 2009, 4:05:14 PM12/29/09
to
> Mo¿e po prostu spróbuj z Collection albo List zamiast Set. Nie opisuj

> adnotacjami JPA implementacji tylko wskazane interfejsy.

yhym, dzieki myslalem o tym wczesniej tylko chcialem sie upewnic od
kogos kto ma wieksze doswiadczenie.

0 new messages