Kamil Mikołajczyk

Kamil Mikołajczyk programista Java /
Grails

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

Przemek, zrozum - zapomnij w ogóle o tym, że są jakiekolwiek id-ki, nie są one istotne. Tutaj podejście jest takie, że pracujesz na obiektach, jedyne co musisz mieć to pole id z adnotacją @Id w każdej klasie @Entity.

Dalej,
1. zmień sobie wszysztkie nazwy klas na rzeczowniki w liczbie pojedynczej (Licencje -> Licencja)
2. zmień sobie nazwy pól na notację camelCase i dodaj do nich gettery i settery zgodnie z konwencją javy
3. jeśli chcesz korzystać z tych relacji w klasie Licencja, korzystaj z nich obiektowo, przykład:

Pracownik pracownik = new Pracownik();
pracownik.setPracownik("Jan Kowalski"); // to pole chyba powinno się nazywać inaczej, np. nazwisko

Klient klient = new Klient();
klient.setNazwa_klienta("Wojciech Nowak"); // patrząc na ten setter widać, dlaczego powinno być camelCase'em

TypyLicencji typLicencji = new TypyLicencji();
typLicencji.setTyplicencji("LGPL"); // znów brak camelCase

Licencja licencja = new Licencja();
licencja.setTyplicencji(typLicencji);
licencja.setPracownik(pracownik);
licencja.setKlient(klient);

jak widzisz utworzyłem obiekty, powiązałem je ze sobą a nie mam żadnego id-ka w kodzie, dalej - jeśli chcesz wyszukać obiekty, to używasz metody findera i ona zwraca Ci OBIEKT lub LISTĘ OBIEKTÓW, a nie żadne id-ki

List<Licencja> licencje = Licencja.findAll()


4. a to o czym Jarek pisał nt. konstruktora to chyba chodzi o to, że w tym konstruktorze przypisujesz wartość pola id, które nie jest nawet parametrem konstruktora, więc pogrubiona linijka oznacza tyle co this.id = this.id;
public Licencje( Klient nazwa_klienta, Pracownik pracownik, String data_wydania, TypyLicencji typlicencji, boolean realizacja) {
this.id = id;
this.klient = nazwa_klienta;
this.pracownika = pracownika;
this.data_wydania = data_wydania;
this.typlicencji = typlicencji;
this.realizacja = realizacja;
}

konto usunięte

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

Po zmianach mam ciągle ten sam komunikat. Te Id-sy wywaliłem

Kamil nie do końca rozumiem o co Ci chodzi w punkcie 2 :(Przemysław Wojtkowiak edytował(a) ten post dnia 05.09.12 o godzinie 17:07
Kamil Mikołajczyk

Kamil Mikołajczyk programista Java /
Grails

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

Przemysław Wojtkowiak:
Po zmianach mam ciągle ten sam komunikat. Te Id-sy wywaliłem
Pokaż kod po zmianach

Kamil nie do końca rozumiem o co Ci chodzi w punkcie 2 :(
camelCase czyli sposób zapisu wielowyrazowych nazw zmienny, np. iloscKlientow albo findAllValidClients(), czyli wyrazy łączone bez spacji i każdy kolejny zaczyna się wielką literą, według takiego schematu powinieneś nazywać wszystko w javie
poza tym, jest taka konwencja i standard związany z java beans, że jeśli masz w klasie


private Typ jakasPrywatnaWartosc;


to getter i setter tego pola musi wyglądać tak:

public Typ getJakasPrywatnaWartosc() {
return this.jakasPrywatnaWartosc;
}

public void setJakasPrywatnaWartosc(Typ val) {
this.jakasPrywatnaWartosc = val;
}

wszystkie frameworki javowe i pochodne zakładają że będziesz trzymał się tej konwencji

konto usunięte

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

Kod zapisu do Tabeli Licencje wygląda tak:

[code]private static void dodajLicencje(EntityManager em, Klient klient, Pracownik pracownik, String data, TypyLicencji licencja, boolean realizacja) {
System.err.println("DodajLicencje Start"); Licencje lic = new Licencje();
lic.setTypLicencji(licencja);
lic.setPracownik(pracownik);
lic.setKlient(klient);
lic.setDataWydania(data);
lic.setRealizacja(realizacja);
System.out.println("id pracownika =" + pracownik.getId());
System.out.println("id klienta =" + klient.getId());
System.out.println("id licencji =" + licencja.getId());
em.getTransaction().begin();
System.err.println(" Dodawanie - start");
em.persist(lic);
System.err.println(" Dodawanie - koniec");
em.getTransaction().commit();
System.err.println("DodajLicencje Koniec");
}[.code]

I podczas commitu wywala błąd

During synchronization a new object was found through a relationship that was not marked cascade PERSIST: pl.java.przemas.Pracownik@175bc6c8.[edited]Przemysław Wojtkowiak edytował(a) ten post dnia 06.09.12 o godzinie 17:50[/edited]
Kamil Mikołajczyk

Kamil Mikołajczyk programista Java /
Grails

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

Przemysław Wojtkowiak:
Kod zapisu do Tabeli Licencje wygląda tak:

private static void dodajLicencje(EntityManager em, Klient klient, Pracownik pracownik, String data, TypyLicencji licencja, boolean realizacja) {
System.err.println("DodajLicencje Start"); Licencje lic = new Licencje();
lic.setTypLicencji(licencja);
lic.setPracownik(pracownik);
lic.setKlient(klient);
lic.setDataWydania(data);
lic.setRealizacja(realizacja);
System.out.println("id pracownika =" + pracownik.getId());
System.out.println("id klienta =" + klient.getId());
System.out.println("id licencji =" + licencja.getId());
em.getTransaction().begin();
System.err.println(" Dodawanie - start");
em.persist(lic);
System.err.println(" Dodawanie - koniec");
em.getTransaction().commit();
System.err.println("DodajLicencje Koniec");
}


I podczas commitu wywala błąd

During synchronization a new object was found through a relationship that was not marked cascade PERSIST: pl.java.przemas.Pracownik@175bc6c8.

chciałem cytując napisać, że nie podałeś kodu, ale w cytacie juz jest ;)

wygląda mi na to, że któryś z obiektów Pracownik/Klient/TypyLicencji jest stworzony ale jeszcze nie zapisany do bazy, czy któryś println wypisuje Ci nulla? Kamil Mikołajczyk edytował(a) ten post dnia 06.09.12 o godzinie 19:02
Jarosław Szczepankiewicz

Jarosław Szczepankiewicz Lead Technical
Consultant

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

kurcze nie nadążam za tymi nowymi dialektami JVM ;)

konto usunięte

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

Nie ma null-a. Zapis ma odbyć się tylko w tabeli licencje.

PS. właśnie nie wiem dlaczego nie pojawił się w poprzednim moim poście kod i reszta wypowiedzi. Może jakiś bug na stronie.....Przemysław Wojtkowiak edytował(a) ten post dnia 06.09.12 o godzinie 20:55

konto usunięte

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

1. Zgodnie z bledem: nie zrobiles persist() na pracowniku. Mozesz tez zrobic tak jak Ci "radzi" blad: do adnotacji @OneToMany dodaj cascade PERSIST.

2. Zamiast System.out/System.err naucz sie uzywac log4j - bardzo oplacalna inwestycja

3. Doczytaj o obsludze wyjatkow. W tej chwili twoj persist() jest "studencki" - wersja "poprawna" wyglada mniej wiecej tak (skopiowane gdzies z googla, wiec niekoniecznie jest dokladnie tak jak ma byc):


Transaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
em.persist(lic);
tx.commit();
} catch (RuntimeException e) {
if (tx != null && tx.isActive()) {
try {
// Second try catch as the rollback could fail as well
tx.rollback();
} catch (HibernateException e1) {
logger.debug(“Error rolling back transaction”);
}
// throw again the first exception
throw e;
}

konto usunięte

Temat: Aplikacja wykorzystująca JPA+Eclipse+JavaSE

OK. Sprawa rozwiązana. Temat do zamknięcia.

Następna dyskusja:

JPA + Aplikacja Desktopowa ...




Wyślij zaproszenie do