1) @JoinTable
Musim se priznat, ze to jsem jen zkopiroval z dokumentace a zmenil
nazvy atributu ;) Ale Pochopil jsem to tak, ze jedna strana vazby M:N
je citizen => cizizen_id a druha strana country => id_country a
lang_country. Proto takto.
2) @AttributeOverrides je tam proto, aby se sloupeck v db jmenoval
spravne. Jinak by to bylo idcountry a langcountry. Trosku me to u
tohodle stve, protoze hezci by samozrejme bylo oanotovat gettry v
CountryPk anotaci @Column ale to se ignoruje. Nuz nic neni idealno a
nebo to delam blbe :).
Jura
Cituji Tuma Martin <[EMAIL PROTECTED]>:
Moc dekuji, jaxe zda, je to presne co potrebuji, jenom bych se rad,
pro lepsi pochopeni' ujistil o nasledujicich vecech:
@JoinTable(
name="citizen_country",
[EMAIL PROTECTED](name="citizen_id")}, // nemá byt
country_id?
[EMAIL PROTECTED](name="id_country"),
@JoinColumn(name="lang_country")}
)
Nac je tam nasledujici override:
@AttributeOverrides({
@AttributeOverride(name="idCountry", column =
@Column(name="id_country")),
@AttributeOverride(name="langCountry", column =
@Column(name="lang_country"))})
Je to kvuli tomu, jak mam mapovano přes mappedKey = id.langCountry?
Moc dekuji, opravdu jste mi velmi pomohl
Martin
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
On Behalf Of Jiri Frydek
Sent: Friday, May 25, 2007 12:46 PM
To: [email protected]
Subject: RE: ManyToMany Anotace
Tak jinak, zkusil js em si udelat maly priklad tak jak jsem to
pochopil, ze to potrebujete. Tak snad Vam to nejak pomuze.
Trida Citizen:
@Entity
@Table(name="tbl_citizen")
@SequenceGenerator(name="SEQ_CITIZEN", sequenceName="seq_citizen",
allocationSize=1)
public class Citizen implements Serializable {
private static final long serialVersionUID = -5055682646938542793L;
private int citizenId;
private Map<Integer, Country> citizenCountries;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="SEQ_CITIZEN")
public int getCitizenId() {
return citizenId;
}
public void setCitizenId(int citizenId) {
this.citizenId = citizenId;
}
@ManyToMany(
targetEntity=Country.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="citizen_country",
[EMAIL PROTECTED](name="citizen_id")},
[EMAIL PROTECTED](name="id_country"),
@JoinColumn(name="lang_country")}
)
@MapKey(name="id.langCountry")
public Map<Integer, Country> getCitizenCountries() {
return citizenCountries;
}
public void setCitizenCountries(Map<Integer, Country> citizenCountries)
{
this.citizenCountries = citizenCountries;
}
}
Trida Country:
@Entity
@Table(name="tbl_country")
public class Country implements Serializable {
private static final long serialVersionUID = -7193652811305990736L;
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="idCountry", column =
@Column(name="id_country")),
@AttributeOverride(name="langCountry", column =
@Column(name="lang_country"))})
public CountryPk id;
private String name;
public CountryPk getId() {
return id;
}
public void setId(CountryPk id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Trida CountryPk:
@Embeddable
public class CountryPk implements Serializable {
private static final long serialVersionUID = 1841620326117312910L;
private int idCountry;
private int langCountry;
... //jen gettry a settry
}
pak kod ukladajici k jednomu obyvateli jedenu zemi v dane lokalizaci:
CountryPk pk = new CountryPk();
pk.setIdCountry(1);
pk.setLangCountry(2);
Country country = new Country();
country.setId(pk);
country.setName("Name");
country = entityManager.merge(country);
Citizen citizen = new Citizen();
Map<Integer, Country> map = citizen.getCitizenCountries();
if (map == null) {
map = new HashMap<Integer, Country>();
}
map.put(country.getId().getLangCountry(), country);
citizen.setCitizenCountries(map);
citizen = entityManager.merge(citizen);
Jura
Cituji Tuma Martin <[EMAIL PROTECTED]>:
Tohle je presne stav, které se chci vyhnout, pokud to pujde.
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
On Behalf Of Jiri Frydek
Sent: Friday, May 25, 2007 10:50 AM
To: [email protected]
Subject: Re: ManyToMany Anotace
Pokud jsem to pochopil spravne, tak by pro Vas mozna bylo lepsi mit
misto dvou tabulek tri:
Citizen s vazbou 1:N na Country a k k nemu s 1:N vazbou na CountryName
(lokalizace jmena daneho statu).
Bude-li navic v Country misto kolekce jmen mapa, pak muze byt jejim
klicem jazyk a pri ziskazni seznamu zemi pak jdenoduse zobrazite jeji
jmeno ve vybrane/vybranych lokalizacich.
Jura
Cituji Tuma Martin <[EMAIL PROTECTED]>:
Dobry den,
Rad bych se zeptal, jestli lze realizovat nejak anotace ManyToMany,
ktere nepracuje s primarnim klicem na strane pripojene tabulky, reps.
treba pracuje jenom s casti primarniho klice. Mam tabulky tab_country,
kde primarni klic je id_country a lang_country (jazykova mutace zaznamu)
a posledni sloupec je name_country v danem jazyku. Potom tabulku tabulku
tab_citizen, kde primarni klic je sequence a obsahuje polozku
citizen_country - potreboval bych nejak udelat mapovani tak, abych v
getCitizenCountry dostal seznam vsech jazyk. Mutaci daneho statu a
vybral si jenom to co potrebuji. Dale mi neni jasne, jak to bude
fungovat pri ukladani - tedy jak ma vypadat setter dane polozky. A
posledni vec, na kterou bych se rad zeptal - co kdyz bude dane
ManyToMany mapovani soucasti primarni klice, pujde ten klic
serializovat? Predem moc vse dekuji za radu, uz se s tim morim par dnu a
nemuzu se phnout z mista. Jo, kdyby to bylo mozno v anotaci pro
Hibernate, bylo by to naprosto skvele.
Martin