Sziasztok!
A következő problémám van.
Van 3 osztály (a példa kedvéért), Autó, Kerék, Csavar. Az autónak vannak kerekei, a keréknek csavarjai (3 szintű tartalmazás)
JPA unidirectional kapcsolat van közöttük. Az Autóban kerékList, a kerékben csavarList
Autó.java
@OneToMany(targetEntity=Kerek.class ,cascade=CascadeType.ALL,orphanRemoval=true) @JoinColumn(name="AUTO_ID" ,referencedColumnName= "ID" )
private List<Kerek> kerekList= new ArrayList<Kerek>();
Kerek.java
@OneToMany(targetEntity=Csavar.class ,cascade=CascadeType.ALL,orphanRemoval=true) @JoinColumn(name="KEREK_ID" ,referencedColumnName= "ID" )
private List<Csavar> csavarList = new ArrayList<Csavar>();
Mivel unidirectional, ezért a tartalmazott osztályban nincs referencia a tartalmazó osztályra.
És a probléma.
Auto auto=new auto();
em.persist (auto) // itt még jó
Kerek kerek= new Kerek();
auto.getKerekList().add(kerek);
Csavar csavar=new Csavar();
kerek.getCsavarList().add(csavar);
em.merge(auto);//itt azt várnám, hogy az újonnan kapott listaelemeket, adott listaelemeket lementse.
Lementi, de a kerek-ben az AUTO_ID null, az auto id-ja helyett.
Tudjátok hogy miért van?
UI: bidirectional relationshippel, mindkét oldalról a relációt beállítva helyesen működik, jól kitölti az auto_id-t. undirectionalnál miért nem?
Előre is koszi a segítséget!
5 Comments
Auth Gábor
Egészen pontosan melyik JPA provider és/vagy milyen alkalmazás szerver?
R Ferenc
EclipseLink 2.3 és GlassFish 3.1.1
Auth Gábor
Hm... megnéztem, hogy annó hasonló esetben hogy csináltam, és nem egészen így, hanem:
Kicsit több munka, de így működni látszik, gondolom azért csináltam így... de lehet, hogy valakinek lesz jobb ötlete, én már másfél éve nem fejlesztettem ilyesmit és hamar kopik a tudás...
R Ferenc
Köszi szépen a választ! De egy olyan megoldás érdekelne ahol csak a végén használjuk az em.persist()-et
Krisztián Karóczkai
A kódodba a em.merge(auto) előtt csinálj egy em.persist(csavar) -t és fog működni így is.