Child pages
  • Tábla összekapcsolás
Skip to end of metadata
Go to start of metadata

Van két bean-em:

users (id,name,phone)
phone(phoneId, phonenumber);

A problémám ha egy telefonszám két usernél ugyan az akkor hogy lehetne hogy ne két külön sort vegyen fel aphone adatbáblába.
pl. Nagy józsef -> 33333-44444
     Kis Gergő -> 33333-44444
Ebben

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

22 Comments

  1. Van két bean-em:

    users (id,name,phone)
    phone(phoneId, phonenumber);

    A problémám ha egy telefonszám két usernél ugyan az akkor hogy lehetne hogy ne két külön sort vegyen fel aphone adatbáblába.
    pl. Nagy józsef -> 33333-44444
         Kis Gergő -> 33333-44444
    Ebben az

  2. folytköv.
    Ebben az esetben a user táblában 2sor a phone táblában egy sor legyen nem gond ha egy kacsoló tábla is van!
    De most minden telefonszámot egy táblába tesz ha van egy telefonszám ami 10 emberhez jó akkor azt 10 szer tesz a phone táblába.

    Ez egy példa nem valós eset csak ezt tudtam kitalálni de remélem így is érthető volt!

  3. Unknown User (rozsomák)

    Ez most java vagy SQL kérdés?
    Rakjál a telszám oszlopra unique constraint-et, és insert előtt ellenőrizd le, h van-e már olyan.
  4. Ez két entity bean lenne és annotációk használatát tanulom
    @OneToMany

  5. @Entity
    public class users {

    private int id;
    ...
    ...
    ...

    public int getId(){
      return id;
    }

    public void setId(int id){
      this.id=id;
    }
    ...
    ...
    ...

    @OneToMany
    @JoinColumns(name="PHONE_ID")
    public Collection<phone> getPhone(){
        return phones
    }

    public void setPhone(Collection<phone> phones){
        this.phones=phones;
    }

    }

  6. Vagy mit csináljak?
    Külön külön vegyem fel a két bean-t (az egyikbe tegyek azonosítót ami a másik tábla elemére fog mutatni)  EJB QL-el kapcsoljam össze és úgy csináljak egy Query-t?
  7. Unknown User (rozsomák)

    Én nem értek ehhez az entity bean-es sztorihoz, de ha jól látom one-to-many-t adtál meg a phone collection-nél. Ezt azért nem értem, mert ha collection, akkor egy emberhez több telefon tartozhat, az alapkoncepció szerint viszont egy telefon több emberhez is, tehát nem one-to-many, hanem many-to-many a kapcsolat. És ilyenkor illik kapcsolótábla. De amig ezt nem tisztázzuk, nem tudok okosabbat mondani.
  8. Igazad lehet inkább ManyToMany-t kéne használni!

  9. Alapvető kérdés az, hogy mit is szeretnél. Próbálj felvezetni egy denormált táblát, amiben benne van az igény, például:
    Id Név Telefonszám
    1 AAA BBB 11-1111-111
    2 AAA BBB 22-2222-222
    3 CCC DDD 33-3333-333
    4 EEE FFF 22-2222-222
    5 EEE FFF 33-3333-333

    Ekkor ki kell választani egy másik nézetet, például azt, hogy egy-egy személynek milyen telefonszámai vannak és viszont:
    AAA BBB(11-1111-111, 22-2222-222); CCC DDD(33-3333-333); EEE FFF(22-2222-222, 33-3333-333)
    11-1111-111(AAA BBB); 22-2222-222(AAA BBB, EEE FFF); 33-3333-333(CCC DDD, EEE FFF)

    Ha azt látod, hogy egy személynél több telefonszám van, de egy telefonszámhoz csak egy személy, akkor azt jelenti, hogy a telefonszám-személy viszonyban egy személyhez több szám, de egy számhoz csak egy személy tartozik (egy-a-többhöz kapcsolat). Ha ezt látod, csak fordítva, akkor több-az-egyhez kapcsolat. Ha azt látod, mint a példában, akkor ez több-a-többhöz kapcsolatot jelent.

    Ezt a kapcsolati viszont kapcsolótáblával lehet elkészíteni, amelyet a JPA le tud kezelni automatikusan.

    Phone.java részlete:

      @ManyToMany(mappedBy="phones")
      public Collection<User> getUsers()
      {
        return users;
      }

    User.java részlete:

      @ManyToMany(fetch=FetchType.EAGER)
      @JoinTable(name = "USERS2PHONES", joinColumns = {@JoinColumn(name = "USERS_ID_FK", referencedColumnName = "ID")}, inverseJoinColumns = {@JoinColumn(name =
    "PHONES_ID_FK", referencedColumnName = "ID")})
      public Collection<Phone> getPhones()
      {
        return phones;
      }

    Oszt ennyi kb... :)
  10. USER
    Id Name phoneID
    1 Kis József 1
    2 Nagy Árpád 1
    3 Fekete Péter 2
    4 Mekk Elek 3
    PHONE
    Id Phone_Number
    1 3333-3333
    2 4444-4444
    3 5555-5555

     

     

    Nekem valahogy így kéne!
    Mert a mostani így néz ki:

    USER
    Id Name PHONE_ID
    1 Kiss József 1
    2 Nagy Árpád 2
    3 Fekete Péter 3
    4 Mekk Elek 4

    PHONE
    Id Phone_Number
    1 3333-3333
    2 3333-3333
    3 4444-4444
    4 5555-5555

  11. Én arra gondoltam hogy elkészítem külön külön kapcsolatok nélkül manuálisan létrehozok egy phoneID mezőt és amikor lekérdezem a query-ben csinálok egy join-t a két tábla között???
  12. Nem tudunk ezzel dűlőre jutni???
  13. Leírtam a megoldást. :)

    Phone.java részlete:

      @ManyToMany(mappedBy="phones")
      public Collection<User> getUsers()
      {
        return users;
      }

    User.java részlete:

      @ManyToMany(fetch=FetchType.EAGER)
      @JoinTable(name = "USERS2PHONES", joinColumns = {@JoinColumn(name = "USERS_ID_FK", referencedColumnName = "ID")}, inverseJoinColumns = {@JoinColumn(name =
    "PHONES_ID_FK", referencedColumnName = "ID")})
      public Collection<Phone> getPhones()
      {
        return phones;
      }

    Kipróbáltad? Ha igen, mi nem működött, mi volt a hiba?
  14. Ezt a hibát kaptam, már máskor is volt ilyen aszthiszem akkor azzal oldottam meg hogy beállítottam a kaszkád-ot.De valójában nem értem hogy ez mi lenne????
  15. Bocs a hiba kimaradt :)
    object references an unsaved transient instance - save the transient instance before flushing
  16. Így már nem volt hiba:

    @ManyToMany(cascade={CascadeType.ALL})

    Van egy szervlet, abban készítettem egy phone collection-t azt megadtan egy user-nak, azt fel is vette az adatb-be de amikor utána megadtam ugyan azt a collection-t egy másik usernak akkor valami detached entity passed to persis hibát ad. Ha egy másik phone collection-t készítek akkor meg ad neki egy újabb id-t és megint az a probléma hogy egy user-hez külön készít egy olyan phone sort ami már létezik az adatb-ban. Magyarul ha van egy 100 user akiknek ugyan az a munkahelyük telefonszáma akkor azt 100 veszi fel a phone táblában!
    Tudom hülyén hangzik de ez csak példa lenne!

  17. Az a phones ugye el van választva az adatbázistól, ezért kell egy emanager.merge(phones), hogy szinkronba hozhassa az adatbázissal az entitás gyűjteményt.
  18. Ezt nem igazán értem megtennéd hogy kifejted egy kicsit!
  19. Egy kicsit segíthetnél mire gondolsz az alatt hogy legyen leválasztva az adatbázisról?
  20. Ha kikerül az EJB context-ből egy entitás példány, akkor "detached" lesz. Azaz a tartalma potenciálisan nincs szinkronban az adatbázisban lévő tartalommal. Ez jelentheti azt, hogy az entitás példány változik, jelentheti azt, hogy maga az adatbázis tartalom változott.

    Egy ilyen entitás példányt hozzá kell igazítani az adatbázishoz, ez a merge művelet. Egyszerűen csak annyi kell, hogy
    emanager.merge(példány);
    és kész.
  21. Nem tudnál egy példát küldeni?
    Azt nagyon megköszönném mert már régóta sz.r.kodok vele!

    meszaros_a_g@freemail.hu

  22. Végre már megcsináltam!
    A gond végül az volt hogy a cascade működését nem értettem egyértelműen, de most már OK!