Piotr Nowicki

Piotr Nowicki JFB Systems,
właściciel

Temat: ManyTo0ne/OneToMany a utrwalanie obiektów

mam dwie encje w nich atrybuty:

@OneToMany(cascade=CascadeType.MERGE,mappedBy="zamowienie")
private List<PozycjaZamowienia> pozycja = new ArrayList<PozycjaZamowienia>();

oraz odwrotnie:

@ManyToOne(cascade=CascadeType.MERGE)
private Zamowienie zamowienie;


i fragment metody zapisującej zamówienie:

zamowienie.setPozycja(getKoszyk());

for (PozycjaZamowienia p : getKoszyk()){
p.setZamowienie(zamowienie);
}
zamowienieService.create(zamowienie);
for (PozycjaZamowienia p : getKoszyk()){
pozycjaZamowieniaService.create(p);
}

efekt działania następujący: pozycje zamówienia zapisują się poprawnie, natomiast w tabeli zamówienia tworzy się rekord + kolejna ilość rekordów identyczna z ilością pozycji zamówień.
Jak to poprawić, żeby w tabeli tworzyło się tylko jedno zamówienie?
Krzysztof Nazarkiewicz

Krzysztof Nazarkiewicz Software Developer

Temat: ManyTo0ne/OneToMany a utrwalanie obiektów

tak na pierwszy rzut oka to brakuje w @ManyToOne definicji columny, gdzie jest tworzona relacja.

konto usunięte

Temat: ManyTo0ne/OneToMany a utrwalanie obiektów

Piotr Nowicki:
mam dwie encje w nich atrybuty:

@OneToMany(cascade=CascadeType.MERGE,mappedBy="zamowienie")
private List<PozycjaZamowienia> pozycja = new ArrayList<PozycjaZamowienia>();

oraz odwrotnie:

@ManyToOne(cascade=CascadeType.MERGE)
private Zamowienie zamowienie;


i fragment metody zapisującej zamówienie:

zamowienie.setPozycja(getKoszyk());
for (PozycjaZamowienia p : getKoszyk()){
p.setZamowienie(zamowienie);
}
zamowienieService.create(zamowienie);
for (PozycjaZamowienia p : getKoszyk()){
pozycjaZamowieniaService.create(p);
}

efekt działania następujący: pozycje zamówienia zapisują się poprawnie, natomiast w tabeli zamówienia tworzy się rekord + kolejna ilość rekordów identyczna z ilością pozycji zamówień.
Jak to poprawić, żeby w tabeli tworzyło się tylko jedno zamówienie?

Cześć

Wklej ciała metod :

zamowienieService.create(zamowienie)

oraz :

pozycjaZamowieniaService.create(p)

pzdr
Piotr Nowicki

Piotr Nowicki JFB Systems,
właściciel

Temat: ManyTo0ne/OneToMany a utrwalanie obiektów

zamowienie:


@Stateless
public class ZamowienieServiceImpl implements ZamowienieService {

@EJB
private ZamowienieDao zamowienieDao;
@Override
public Zamowienie create(Zamowienie zamowienie) {
zamowienieDao.dodajZamowienie(zamowienie);
return zamowienie;
}

i zamowienieDao:

@Override
public Zamowienie dodajZamowienie(Zamowienie zamowienie) {
return em.merge(zamowienie);
}


pozycja:

@Stateless
public class PozycjaZamowieniaServiceImpl implements PozycjaZamowieniaService {

@EJB
private PozycjaZamowieniaDao pozycjaZamowieniaDao;
@Override
public PozycjaZamowienia create(PozycjaZamowienia pozycjaZamowienia) {
pozycjaZamowieniaDao.dodajPozycjaZamowienia(pozycjaZamowienia);
return pozycjaZamowienia;
}

i pozycjaZamowieniaDao:

@Override
public PozycjaZamowienia dodajPozycjaZamowienia(PozycjaZamowienia pozycjaZamowienia) {
return em.merge(pozycjaZamowienia);
}
Sebastian Kolski

Sebastian Kolski programista/DBA

Temat: ManyTo0ne/OneToMany a utrwalanie obiektów

Używasz pewnie merge do tworzenia encji. Jeśli do merge przekazywany jest nowy obiekt to merge go nie zmienia (ani nie powoduje, że robi się on zarządzany). Za to tworzy nowy, zarządzany i zwraca go. To by wyjaśniało dlaczego robi się najpierw rekord zamówienia (zamowienieService.create(zamowienie)) a potem kolejne rekordy w ilości równej pozycji (pozycjaZamowieniaService.create(p)).
Jeśli zawsze tworzysz nowe zamówienia to zmień merge na persist i rodzaj cascade to nie będziesz musiał osobno zapisywać zamówienia i pozycji.
Oczywiście bez podania ciał metod create i getKoszyk jest to tylko strzał w ciemno (getKoszyk() może przy każdym wywołaniu robić defensywną kopię i ją zwracać....)

// edit
no właśnie zobaczyłem ciała metod, no i rzeczywiście, co prawda zwracasz przy merge obiekt wynikowy, ale nic z nim już dalej nie robisz (w metodzie wcześniejszej ignorujesz go)Sebastian Kolski edytował(a) ten post dnia 28.01.10 o godzinie 19:07
Piotr Nowicki

Piotr Nowicki JFB Systems,
właściciel

Temat: ManyTo0ne/OneToMany a utrwalanie obiektów

dzięki, Twoja wypowiedź mi pomogła :-) bez persist też się dało. Pominąłem persist, bo miałem problem z dodaniem obiektu z listy rozwijanej do jednego z atrybutów encji "zamowienie".

for (PozycjaZamowienia p : getKoszyk()){
p.setZamowienie(zamowienie);
}
zamowienie.setPozycja(getKoszyk());
zamowienieService.create(zamowienie);


działa tak jak chciałem.

Podobne tematy


Następna dyskusja:

JPA oraz @OneToMany




Wyślij zaproszenie do