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