ak by to niekomu pomohlo tak odpoved je tu:
Be aware that once loaded, the key is no longer kept in sync with the
property, in other words, if you change the property value, the key will
not change automatically in your Java model (for true map support please
refers to Hibernate Annotation Extensions). Many people confuse <map>
capabilities and @MapKey ones. These are two different features. @MapKey
still has some limitations, please check the forum or the JIRA tracking
system for more informations.
takze ak pouzijete "stary" sposob definovania mapovania XML-ko a, napr:
<map name="values" cascade="all-delete-orphan" lazy="false"
inverse="false">
<key column="ITEM_ID"/>
<map-key type="string" column="value_key"/>
<one-to-many class="ItemValue"/>
</map>
tak ste "za vodou" a o vsetko je postarane. ak pouziteje anotacie musite
sa o to postarat sam a nastavovat property pre map-key manualne.
Ivan
Ivan Polák wrote / napísal(a):
Zdravim konferenciu,
kedze nikto nezareagoval na moju minulu otazku (prikladam ju nizsie)
spytam sa takto. Ked mam namapovany MAP pomocou @MapKey:
@OneToMany(mappedBy = "house", fetch = FetchType.LAZY, cascade =
CascadeType.ALL, targetEntity = com.xxx.model.HousePropertyValue.class)
@MapKey(name = "valueKey")
private Map<String, HousePropertyValue> housePropertyValues = new
HashMap<String, HousePropertyValue>();
staci spravit:
house.getHousePropertyValues().put("popis1", new
HousePropertyIntegerValue(10));
alebo musim pre dany objekt este manualne nastavit property, ktora je
pouzivana na ulozenie kluca:
house.getHousePropertyValues().get("popis1").setValueKey("popis1");
pretoze mne funguje mapovanie iba vtedy ked tam mam aj toto
"manualane" nastavenie valueKey vlastnosti.
dakujem
Ivan
povodna otazka:
pouzivam Hibernate a mapovanie MAP pomocou anotacii.
v programe sa mi objavila zaujimava chyba. Po istom case sa mi prestal
ukladat kluc do stlpca v DB, aplikacia ziadnu vynimku nevypisuje, ale
kluc v DB nie je ulozeny.
subor House.java:
@OneToMany(mappedBy = "house", fetch = FetchType.LAZY, cascade =
CascadeType.ALL, targetEntity = com.xxx.model.HousePropertyValue.class)
@MapKey(name = "valueKey")
private Map<String, HousePropertyValue> housePropertyValues = new
HashMap<String, HousePropertyValue>();
//get a set pre housePropertyValues
a subor HousePropertyValue.java je abstraktna trieda, kde urcim ze
kluc sa ma ukladat do tabulky house_property_value stlpec value_key a
to ze aka treida bola pouzita je ulozene v stlpci value_type
(discriminator):
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="value_type",
discriminatorType=DiscriminatorType.STRING
)
@Table(name="house_property_value")
@javax.persistence.SequenceGenerator(
name="seq_house_property_value",
sequenceName="s_house_property_value",
allocationSize=1
)
public abstract class HousePropertyValue implements Serializable {
@Column(name = "value_key")
private String valueKey;
@ManyToOne (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "fk_house_id", referencedColumnName = "id")
private House house;
...
public String getValueKey() {
return valueKey;
}
public void setValueKey(String valueKey) {
this.valueKey = valueKey;
}
@Transient
public abstract Object getValue();
public abstract void setValue(Object value);
}
a jej implementacia HousePropertyIntegerValue (pouzivam aj
HousePropertyDateValue ):
@Entity
@DiscriminatorValue("INTEGER")
@javax.persistence.SequenceGenerator(
name="seq_house_property_value",
sequenceName="s_house_property_value",
allocationSize=1
)
public class HousePropertyIntegerValue extends HousePropertyValue {
@Column(name = "value_integer", nullable = false)
private Integer value;
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public void setValue(Object value) {
this.value = (Integer) value;
}
....
}
no a stlpec value_key v tabulke house_property_value je vzdy prazdny.
stlpec value_type v pripade pouzitia HousePropertyIntegerValue ma
hodnotu INTEGER, v pripade pouzitia HousePropertyDateValue ma hodnotu
DATE a aj vsetky ostatne stlpce su spravne zapisane.
napr. house.getHousePropertyValues().put("popis1", new
HousePropertyIntegerValue(10));
neviete kde moze byt problem?
velmi pekne dakujem
Ivan