Od paru dni siedzę nad problemem zorganizowania dostępu do wielu baz
danych poprzez JPA. Ma to się odbywać w ramach ziaren EJB 3.0.
Oto kilka szczegółów aplikacji:
- nie ma z góry przypisanej liczby baz danych, do których się
podłączamy (liczba ta zmienia się w trakcie działania programu)
- każda z baz danych ma tą samą strukturę (mapowane są te same klasy
encji)
- chciałbym umieścić to wszystko w ramach ziarna stanowego (Stateful
EJB 3.0)
Do tej pory próbowałem czegoś takiego:
- stworzyłem w persistence.xml 3 persistence unit (PU; każda z inną
nazwą i z inną bazą danych) i każda ma obsługiwać encje tego samego
typu
- w ziarnie stanowym stworzyłem mapę typu: Map<String nazwa,
EntityManagerFactory fabryka>, gdzie nazwa jest nazwą PU, dla którego
jest stworzona fabryka managera
- w wywołaniu metody zapisu obiektu przekazuję jako parametr nazwę PU
oraz dane potrzebne do stworzenia obiektu, który zapisujemy do bazy
- w ciele metody używam struktury if-else do pobrania z mapy
odpowiedniej fabryki
- za pomocą fabryki tworzę obiekt typu EntityManager
- z danych przekazanych w wywołaniu tworzę obiekt do zapisu
- wywołuję metodę persist(Object) zarządcy encji
W momencie, gdy uruchamiam to i wywoływana jest ta metoda wszystko
idzie dobrze do momentu tworzenia obiektu. Wyskakuje mi w tym miejscu
błąd:
java.lang.IllegalArgumentException: Object: entities.Person[id=null]
is not a known entity type.
at
oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:
3212)
at
oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:
205)
at beans.SFPersonBeanBean.createPerson(SFPersonBeanBean.java:
76) ..................
Ma ktoś jakiś pomysł co z tym błędem zrobić, z czego on wyniknął lub
cokolwiek?
Może jest inny sposób na rozwiązanie tej sytuacji (obsługa wielu baz
danych)? Inne API było by lepsze (Hibernate, TopLink lub Kodo JPA)?
Będę ogromnie wdzięczny za jakiekolwiek odpowiedzi.
pozdrawiam
Michał Chmielarz
> Ma ktoś jakiś pomysł co z tym błędem zrobić, z czego on wyniknął lub
> cokolwiek?
> Może jest inny sposób na rozwiązanie tej sytuacji (obsługa wielu baz
> danych)? Inne API było by lepsze (Hibernate, TopLink lub Kodo JPA)?
>
> Będę ogromnie wdzięczny za jakiekolwiek odpowiedzi.
Czego uzywasz jako implementacji JPA? jezeli hibernate, to moze Hibernate
shards Ci jakos sie nada...
Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ ]
[ Ekg: #3781111 ][ ]
[ LinuxUser: #249916 ][ ]
Nie używam żadnych klas i metod specyficznych dla danego dostawcy
persistence.
Jako dostawcę w persistence.xml mam ustawionego TopLink'a.
Zastanawiam się czy jest w ogóle możliwość zrobienia tego w ramach
specyfikacji JPA.
Michał
Tworzenie tego cuda zacząłem od sprawdzenia działania właśnie tylko
dla jednej bazy z jednym PU. Działało dobrze - tworzyło tabelki jakie
trzeba było i wsadzało tam encje za encją. Dopiero się wywaliło jak
dołożyłem kolejne PU. :|
Tak - JPA dopuszcza wiele PU, więc można równocześnie pracować na wielu bazach
danych (mogę przynajmniej mówić za WebLogic 10 czyli Kodo/OpenJPA - nie znam
aż tak szczegółów konfiguracji u tych Klientów, którzy tego używają, ale nie
słyszałem, aby była to jakaś specjalna konfiguracja - tyle, że trzeba używać
XA). Skłaniałbym się zatem bardziej ku sprawdzeniu konfiguracji, zwłaszcza że
wyjątek wygląda na typowy.
Pozdrawiam,
Waldek
PS
Na jakiejś prezentacji wewnątrz BEA pamiętam też, że Patrick Linskey
wspominał, że nawet można dynamicznie (programowo) podmieniać mapowania -
przydatne gdyby chcialo sie np. przechowywac różne instancje entity w różnych
tabelach/bazach danych (np. klient o ID od 0 do 100 w tabeli Customer_100, 101
do 200 w tabeli Customer_200, itd.). Oczywiście bez zmiany modelu logicznego.
Jak widać JPA - mimo wersji 1.0 - jest dosyć pojemne.
PS 2
To czego JPA w obecnej wersji nie ma ustandaryzowanego, to współpracy wielu
implementacji/dostawców w ramach jednej aplikacji. Jest oczywiście XA i to
załatwia większość problemów, ale pozostaje choćby uzgadnianie cache'y (a
przynajmniej niewchodzenie jeden drugiemu).
PS 3
"Ziarna" ??? Brrr... Jacek - coś czuję, że to znowu Twoja sprawka ;-D
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
OK - to pozostaje mi tylko sprawdzenie w takim razie konfiguracji.
Możliwe, że coś pominąłem - początkujący jestem w JPA po prostu
no... :)
Ziarnka, fasolki, beany... HMM - bez bicia przyznaję, że byłem na
ostatnim wykładzie Jacka w Poznaniu. :P
Rety - to już poza Warszawę wyszło ??? Jak ktoś spoza Polski coś o 'ziarnach
EJB' napisze, to wystąpię żeby ukarać Jacka jakoś drastyczniej - do wyboru:
1. miesięczny zakaz publikacji na blogu
2. przyznanie racji, że Spring nie jest serwerem aplikacyjnym
3. ogłoszenie światu, że Netbeans sucks a Eclipse rulez
4. na pytania 'gdzie dowiedzieć się więcej o Geronimo' odpowiadanie:
http://www.geronimos.com/
A najlepiej wszystko razem...
;-)
W.
Ty okrutniku!
Bartek
Może zasłużył na to wszystko, ale...
ECLIPSE......??!! 8)
Przecież wszyscy wiedzą, że Netbeans lepszejszy... :P
> Rety - to już poza Warszawę wyszło ??? Jak ktoś spoza Polski coś o 'ziarnach
> EJB' napisze, to wystąpię żeby ukarać Jacka jakoś drastyczniej - do wyboru:
> 1. miesięczny zakaz publikacji na blogu
> 2. przyznanie racji, że Spring nie jest serwerem aplikacyjnym
> 3. ogłoszenie światu, że Netbeans sucks a Eclipse rulez
> 4. na pytania 'gdzie dowiedzieć się więcej o Geronimo' odpowiadanie:
> http://www.geronimos.com/
ROTFL :)
--
Krzysztof Wolny
kkk....@gmail.com (replace 'kkk' with one 'k')
> Od paru dni siedzę nad problemem zorganizowania dostępu do wielu baz
> danych poprzez JPA. Ma to się odbywać w ramach ziaren EJB 3.0.
Cześć Michał,
Trochę to trwało, ale w końcu jest. Właśnie opublikowałem artykuł o JPA
- Dynamiczny dostęp do wielu baz danych w JPA [1], który wierzę, że
odpowiada na pytanie z wymaganymi detalami. Miłej lektury!
p.s. Tylko więcej takich (dociekliwych) pytań w 2008 ;-)
Jacek
[1]
http://www.jaceklaskowski.pl/wiki/Dynamiczny_dost%C4%99p_do_wielu_baz_danych_w_JPA
--
Jacek Laskowski
http://www.JacekLaskowski.pl
> "Ziarna" ??? Brrr... Jacek - coś czuję, że to znowu Twoja sprawka ;-D
A jak! ;-) Ziarna już zadomowiły się u mnie na dobre.
p.s. Nie wyobrażasz sobie jak uśmiałem się, kiedy to przeczytałem -
dobrze, że nie piłem wtedy herbaty, bo miałbym ją całą na monitorze.
Potrafisz wstrząsnąć człowiekiem ;-)
Jacek
> Rety - to już poza Warszawę wyszło ???
A mówiłem, abyś się zebrał z jakąś prezentacją nt ziaren springowych ;-)
Szykuje się kilka konferencji w Polsce w przyszłym roku, więc albo
będziesz prelegentem z tymi beanami, albo rok 2008 odnotujemy jako
kolejny rok ziaren.