Zdravim konferenciu,

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