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




Odpovedet emailem