jpa i serializacja pytania

0

Cześć,

Mam dwa pytania poproszę o odpowiedz.

Więc tak, mam aplikację, która poprzez JPA łączy sią z bazą i zawsze pobieram całe obiekty, listę obiektów.
Zastanawiam się czy jest sposób aby pobrać konkretną wartość pola obiektu typu np. string z bazy? czy jest taka możliwość? W jaki sposób mógłbym to zrealizować.

Moja aplikacja korzysta z bazy mysql lokalnie, moje mapowane klasy aktualnie nie posiadają interfejsu "serializable" kiedy jest to wymagane?. Jak będę posiadał bazę do której będę się łączył zdalnie? Lokalnie posiadam możliwość wykonywania operacji crud. Czy jeśli skorzystam z bazy zdalnej to coś nie będzie działać?

Pozdrawiam.
uff pierwszy post :)

0
  1. Aby pobierac pojedyncze wartosci a nie cale obiekty uzywaj EntityManager.createQuery("select p.name from Person p"). W wyniku dostaniesz obiekty typu Query, ktory mozesz uzyc do wywolania sql ktory zostanie przetlymaczony z JPQL ktory napisales. Poczytaj o JPQL a dowiesz sie wiecej. Mozesz dosac liste, mozesz dostac pojedyncza wartosc itp.
  2. Serializable nie jest wymagane do laczenia sie z baza. Zapisy, odczyty, usuwanie i updaty robione sa za pomoca SQL, a w nich leca wartosci skalarne jak String, int czy boolean. Jesli zmapujesz jakis obiekt wlasnego typu jako pole w jakiejs encji, i nie ustawisz zeby bylo @Embedded, wtedy klasa takiego pola musi byc Serializable.
    Serializable jest tez wymagane jesli przesylasz obiekty modelu JPA miedzy roznymi JVM. Np, masz serwer ktory uzywa JPA, i wysyla obiekty do klienta, ktory z nich korzysta aby wyrenderowac widok. Aby takie przesylanie zakonczylo sie powodzeniem, JVM musi jakos zamienic te obiekty na ciag bajtow - w tym miejscu wlasnie dziala serializacja. Przykladem moga byc wywolania EJB3 ktore sa remote. Jsli uzywasz beanow lokalnych, i one sa uzywane np w servlecie aby generowac widok, to znaczy ze obiekty modelu JPA nie opuszczaja JVM serwera i nie musza byc serializowalne.
0

Dzieki za odpowiedz,

mam mapowanie w moim przykładzie obiektu typu Grupa

coś takiego:

@ManyToOne
@JoinColumn(name="ID_GRUPY")
private Grupa grupa;

wtedy nie muszę miec serializable? gdzies wyczytałem że obiekty wbudowane nie mają swojego identyfikatora, w moim przypadku jest identyfikator w encji Grupa.
Gdyby mi brakowało serializacji to w jaki sposób bym to zauważył ? nie mógł bym wykonywac operacji?

Pozdrawiam

0

Co to Twojego przykladu, przeczytaj jeszcze raz co wczesniej napisalem. Mozesz potrzebowac serializacje, a moze nie. To zalezy ;d Jesli nie wysylasz obiektow do innej JVM, to nie bedziesz potrzebowac. Jesli natiomast chodzi nie o encje, lecz obiekty ktore chcesz zapisac w bazie a ktoe maja byc jedynie atrybutami encji, to masz wybor: albo @Embedded / @Embedded, albo @lob; w ostatnim przypadku musi dany typ byc serializowany. W Twoim przykladzie nie Grupa jest encja, wiec sie nie martw.
Co do id, to nie posiadaja go typy embedded. Typy wbudowane to ja rozumiem String, Date, BigDecimal itp (wbudowane w JDK), ale moze chodzilo wlasnie o embedded. I owszem, takie typy nie posiadaja swojego id, nie sa one encjami, sa niejako wbudowywane w zawierajaca je encje (moze o to chodzi z typami wbudowanymi?). W przypadku Grupa, sam jawnie zaznaczyles ze jest to @ManyToOne, czyli relacja encja do encji, i ma swoje id.
Gdybys nie mial serializowanej encji, a powinienes miec, to bys to zauwazyl najprawdopodobniej w 1 sposob: w runtime bys dostal wyjatek java.io.NonSerializableException. Jesli pole jakiejs encji chcesz zapisac do BLOBA, i anotuje je za pomoca @lob, a nie jest serializowalne, dostaniesz jakis inny wyjatek JPA prawdopodobnie podczas walidacji klas wchodzacych w sklad persistence unit (eclipselink np tak robi). Wierze ze uruchomisz program choc raz przed oddaniem na zaliczenie / klientowi, wiec bedziesz wiedziec.

0

thx, teraz rozumiem
pozdr.

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