Child pages
  • JPA unidirectional kapcsolat
Skip to end of metadata
Go to start of metadata

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!

      
      
Page viewed times
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels

5 Comments

  1. Egészen pontosan melyik JPA provider és/vagy milyen alkalmazás szerver?

  2. EclipseLink 2.3 és GlassFish 3.1.1

    1. Hm... megnéztem, hogy annó hasonló esetben hogy csináltam, és nem egészen így, hanem:

      Csavar csavar=new Csavar();
      em.persist(csavar);
      
      Kerek kerek=new Kerek();
      kerek.getCsavarList().add(csavar);
      em.persist(kerek);
      
      Auto auto=new auto();
      auto.getKerekList().add(kerek);
      em.persist(auto);

      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... (smile)

  3. 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 

  4. A kódodba a em.merge(auto) előtt csinálj egy em.persist(csavar) -t és fog működni így is.