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))
22 Comments
M Attila
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
M Attila
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!
Unknown User (rozsomák)
Rakjál a telszám oszlopra unique constraint-et, és insert előtt ellenőrizd le, h van-e már olyan.
M Attila
Ez két entity bean lenne és annotációk használatát tanulom
@OneToMany
M Attila
@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;
}
}
M Attila
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?
Unknown User (rozsomák)
M Attila
Igazad lehet inkább ManyToMany-t kéne használni!
Auth Gábor
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")
User.java részlete:public Collection<User> getUsers()
{
return users;
}
@ManyToMany(fetch=FetchType.EAGER)
Oszt ennyi kb... :)@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;
}
M Attila
Nekem valahogy így kéne!
Mert a mostani így néz ki:
M Attila
M Attila
Auth Gábor
Phone.java részlete:
@ManyToMany(mappedBy="phones")
User.java részlete:public Collection<User> getUsers()
{
return users;
}
@ManyToMany(fetch=FetchType.EAGER)
Kipróbáltad? Ha igen, mi nem működött, mi volt a hiba?@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;
}
M Attila
M Attila
object references an unsaved transient instance - save the transient instance before flushing
M Attila
Í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!
Auth Gábor
M Attila
M Attila
Auth Gábor
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.
M Attila
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
M Attila
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!