Dodawanie klasy do biblioteki

0

Witam,
chciałbym się zapytać czy jest szansa dodać swoja klase do jakiejś biblioteki.
Np. mam .jar z biblioteka Eclipselinka i chciałbym tam wrzucić jakąś moją klase.
Jest taka możliwość ?

0

Ale tak u siebie lokalnie? Możesz ja po prostu na jana wrzucic do jara, bo jar to jest zwykły zip ;] Ale nie bardzo pojmuje jaki to by miało sens praktyczny.

0

Potrzebne mi to ponieważ potrzebuje jedna klase załadowac przed wszystkim a zewnętrzne biblioteki tak włąsnie mi się ładuja.

Mam teraz taki problem w bibliotece eclipselinka mam klase PersistenceProvider.class i chce do tej biblioteki dorzucić nowa klase NewpersistenceProvider wiec zbudowałem nowy projekt i stworzyłem w nim klase:


package org.eclipse.persistence.jpa;

public class NewPersistenceProvider extends org.eclipse.persistence.jpa.PersistenceProvider {

}

i plik NewPersistenceProvider.class wrzucilem do jara eclipslinka niestety jak teraz probuje to odpalić to wyskakuje mi taki bład:
Caused By: java.lang.Error: Unresolved compilation problem:
org.eclipse.persistence.jpa.PersistenceProvider cannot be resolved to a type

Co robie zle ?

0

Brakuje zależności do EclipseLink. Generalnie to masz złe podejście.

  1. Stwórz nowy, maven'owy projekt.
  2. W nim dodaj zależność od EclipseLinka, scope "provided".
  3. Stwórz swoją klasę, zbuduj, wrzuć do lokalnego repo za pomocą maven install.
  4. W drugim, mavenowym projekcie dorzuć zależność do poprzedniego projektu.

Maven powstał dokładnie po to, żeby rozwiązywać problemy takie jak te.

0

@janiu ja nadal nie bardzo rozumiem co ty chcesz osiągnąć, ale to co próbujesz zrobić jest skazane na porażkę. Czemu chcesz żeby klasa ładowała się wcześniej niz inne? To jest bardzo zły pomysł polegać na kolejności classloadera, szczególnie że można ją sobie zmienić... Zresztą program powinien być tak napisany żeby nie musiał polegać na takich rzeczach jak wpływ zorzy polarnej i promieniowanie kosmiczne...

Napisz jaki jest "wyjściowy problem", bo na pewno da sie go rozwiazać bardzo łatwo.

0

chciałbym przeładować klase PersistenceProvider.xml z biblioteki eclipselinka i nadpisuje ta klase, do persistence.xml dodaje linijke:

<provider>org.persistence.jpa.NewPersistenceProvider</provider>

ale wyskakuja błedy i dlatego wyczytałem ze tak może się dziac dlatego ze ta klasa ładuje sie za pozno a biblioteki zewnętrzne ładują się wczesniej.

0

Nie wiem gdzie to wyczytałeś, ale nie korzystaj już z tego źródła ;] A teraz pokaż JAKIE błędy ci się pojawiają.

0

This version of OpenJPA cannot read a persistence.xml document with a version different from "1.0". Found: version "2.0" in "zip:D:/work/domains/clmdemo_domain/servers/wls2/tmp/_WL_user/abc-server-ear/bd0nwg/lib/abc-server-weblogic.jar!/META-INF/persistence.xml".

2015-09-29 13:41:26,252|FATAL|common.ServerStartUpBean|start|Application startup failed due to javax.persistence.PersistenceException: No Persistence provider for EntityManager named pu-non-jta|Exception:
javax.persistence.PersistenceException: No Persistence provider for EntityManager named pu-non-jta


0

I serio myślisz że te cuda na kiju które robisz pomogą? o_O Przecież masz napisane w czym problem. Używasz starej wersji biblioteki OpenJPA która jest niekompatybilna z JPA 2.0, a twoje pliki konfiguracyjne korzystają z JPA 2.0
Użyj nowej wersji OpenJPA / Zmień providera a nie cuduj.

0

no tylko że jeżeli nie nadpisze tej klasy to wszystko działa poprawnie

0

Oznacza to że próbujesz zrobić coś czego nie rozumiesz. Probujesz napisać Persistence Providera podczas gdy ewidentnie nie masz o tym pojęcia. Domyślam się, że samo extendowanie tej klasy "na pałe" nie wystarczy ;] Możesz wyjaśnić po co chcesz zrobić własną klasę która z niej dziedziczy? Bo myśle że to już jest błąd i dziwny sposób na rozwiązanie prostego problemu.
Zacznij od początku, od problemu który masz. Nie od tego jak próbujesz go rozwiązać.

0

Mam klasę A która ma adnotacje @Entity i muszę zrobić tak że w momencie kiedy ktoś doda klasę B extends A z adnotacja @Entity wtedy adnotacja klasy A zmieni się z @Entity na @MappedSuperclass.

Wydaje mi się że poprzez klasę PersistenceProvider a dokładniej przez EntityManagerFactory i Matemodel da się to zrobić, nie jestem pewien ale żeby to sprawdzić musze nadpisać ta klase i potestować jej funkcje.

0

Ale widzisz że to z logicznego punktu widzenia zupełnie nie ma sensu, prawda? Bo skoro klasa A jest Entity to może chcesz przechowywać obiekty tej klasy w bazie i to będą obiekty klasy A. I masz aplikację która ma bazę z tymi obiektami. A teraz ktoś robi sobie klasę B i co wtedy? Kasujesz te encje A? Bo przecież one nie są encjami B. A jeśli encji klasy A nie ma i nie będzie bo to tylko baza to możesz od razu zrobić MappedSuperclass. Taka dynamiczna zmiana to jest mocny WTF bo albo nagle skasujesz komuś pół bazy albo program będzie ci sie sypał bo JPA wykryje że ma niezgodne mapowanie z bazą danych (bo ma tabele których być nie powinno).
We need to go deeper. Jaki problem chcesz rozwiązać tym karkołomnym pomysłem? Bo mam wrażenie że idziesz tu jakąś kaskadą coraz bardziej chorych pomysłów :D Gdzieś tam na samym początku jest jakiś codzienny prosty problem, który chcesz rozwiązać w dziwny sposób, a ten dziwny sposób wymaga jakiegoś mega skomplikowanego rozwiązania, które wymaga jeszcze bardziej porytego kodu, który wymaga....
Więc pytam jeszcze raz: jaki problem chcesz rozwiązać. Ten pierwotny, nie problemy z twoimi "rozwiązaniami".

0

W momencie kiedy ktos do mojego kodu chce dołaczyc jakas klase (klasa B extends A) encji klasy A nie bedzie, ale ten ktos nie ma dostepu zeby zmienic na @MappedSuperclass, wiec potrzebny mi mechanizm który to zmieni.

Powodem ejst pozbycie się kolumny DYTYPE która jest nie potrzebna i której nie ma w przypadku @MappedSuperclass

0

Nie bardzo rozumiem czemu po prostu nie zrobisz @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS). Wtedy nie będzie tego pola o którym mówisz, bo występuje tylko dla InheritanceType.SINGLE_TABLE (które jest defaultem). W czym problem? Nie dość że uzyskasz dokładnie taki efekt jaki chcesz to jeszcze będzie to miało sens logiczny bo nie będzie problemu z encjami A które zgodnie z twoim pomysłem nagle by musiały poznikać albo wysypać aplikacje..., nie mówiąc już o tym że jest to standardowa funkcjonalność JPA i nie wymaga cudów na kiju które próbujesz wyczyniać...

0

Tylko ze wtedy tworzy się nowa tabela o nowej nazwie dla tej klasy dziedzicacej, a ja bym chciał żeby to się znajdowało w tej samej tabeli.

@Shalom da się to tak zrobić? Zeby nie tworzyła się nowa tabela tylko obiekty tej klasy potomnej zostały wrzucane do tamtej tabeli, ale bez kolumny DYTYPE ?

0

A jak niby JPA ma wtedy rozpoznawać którego typu jest dany obiekt? Myślisz ty chociaż trochę? o_O Jak robisz SingleTable to jakoś JPA musi wiedzieć co powyciągać jak każesz pobrać encje B. Jak nie będzie kolumny z dysktryminatorem to jak to ma zrobić? Za pomocą szaklanej kuli? o_O Poza tym nie pojmuje co ci tak kolumna przeszkadza. Ba, skoro używasz ORMa to w ogóle nie powinno cię interesować jak wygląda baza.

0

Ok dzieki za odpowiedz.
Mam jeszcze jedno pytanie. W bibliotece EclipseLinka jest taka klasa "MetamodelImpl" która zawiera mapy klas oznaczonych adnotacja "Entity" i "MappedSuperclass" i teraz np gdy przez refleksje kasuje zawartosc takiej mapy to program działa dalej a powinnien się wysypać, dlaczego tak jest? Te mapy są tylko pogladowe i nie wpływaja na działanie czy są cały czas na nowo inicjalizowany czy jak ?

0

A niby skąd pomysł że powinien sie wysypać? o_O Przecież to jest jakaś klasa z publicznie dostępnym API z której mozesz sobie pewne dane pobrać. Dlaczego uważasz że to jest klasa która trzyma wewnętrzny stan na podstawie którego wykonywane są zapytania za pomocą EntityMangera? Wcale przecież nie musi tak być.
Niemniej nie wiem jak to jest, nie znam na pamięć każdej implementacji JPA. Jeśli cie to interesuje to zapnij się tam debugerem i zobacz co z czego korzysta. Niemniej podtrzymuje to co napisałem wcześniej: robisz jakieś cuda na kiju cholera wie po co, a do tego masz bardzo małe pojęcie o tym co robisz. Nic z tego co próbujesz zrobić nie będzie działać, bo programowanie opiera sie na ROZUMIENIU co robisz. Programowanie metodą monte-carlo przez losowe zmiany w kodzie nigdy nie daje sensownych rezultatów.

0

Juz nawet nie chodzi o ten problem, własnie próbuje to wszysko zrozumieć dlatego pytam.
Chciałbym dojsc do tych list które przechowują te klasy, mógłbys mi poradzić jak się do nich dokopać ?

0

Nie bardzo rozumiem pytanie. Zapnij się debugerem gdzieś gdzie wołasz jakieś query na entity mangerze i rób step into do klas z bibliteki aż trafisz na to co cie interesuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1