Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-如何持久化HashMap_Java_Hibernate_Map_Hashmap_Persist - Fatal编程技术网

Java Hibernate-如何持久化HashMap

Java Hibernate-如何持久化HashMap,java,hibernate,map,hashmap,persist,Java,Hibernate,Map,Hashmap,Persist,在搜索Stackoverflow时,我发现很多人都有我同样的问题,但我无法从其他帖子中找到解决方案。因此: 我试图持久化Hibernate类,但不使用实体对象。相反,我使用的是地图 这是我的地图: Map<String, Object> record; record = new HashMap<String, Object>(); ... record.put("key1", "value"); record.put("key2", "value"); record.

在搜索Stackoverflow时,我发现很多人都有我同样的问题,但我无法从其他帖子中找到解决方案。因此:

我试图持久化Hibernate类,但不使用实体对象。相反,我使用的是地图

这是我的地图:

Map<String, Object> record;
record = new HashMap<String, Object>();

...

record.put("key1", "value");
record.put("key2", "value");
record.put("field1", "value");
record.put("field2", "value");
record.put("field3", "value");
record.put("field4", "value");
record.put("field5", "value");
record.put("field6", value);
record.put("field7", value);
返回此错误:

org.hibernate.id.IdentifierGenerationException:调用save()之前必须手动分配此类的id

有人能帮我吗?
提前感谢

简短回答:你的班级需要成为一名POJO

详细回答:您需要为复合ID创建一个单独的类,比如

public final class CompositeId implements Serializable {
  private String first;
  private String second;

  // getters, setters, hashCode, equals
}
您的持久对象将是

public class YourClass {
  private CompositeId id;
  private Map map;

  public YourClass() {
    this.map = new HashMap();
  }

  public void setId(CompositeId id) {
    this.id = id;
  }

  public CompositeId getId() {
    return id;
  }

  public void setField1(String field1) {
    this.map.put("field1", field1);
  }  

  public String getField1() {
    return map.get("field1");
  }  
  // and so forth
}
最后,您的.hbm.xml文件:

<class entity-name="entity_name" dynamic-update="true">
<composite-id name="id" class="CompositeId">
    <key-property name="first" column="Key1" type="string"/>
    <key-property name="second" column="Key2" type="string"/>
</composite-id>
    <property name="field1" column="field1" type="string"/>
    <property name="field2" column="field2" type="string"/>
    <property name="field3" column="field3" type="string"/>
    <property name="field4" column="field4" type="string"/>
    <property name="field5" column="field5" type="string"/>
    <property name="field6" column="field6" type="double"/>
    <property name="field7" column="field7" type="double"/>
</class>

我解决了这样更改复合id属性的问题:

<composite-id class="CompositeId" mapped="true">

mapped=“true”是解决方案的关键)


然后在hashmap中分配键属性值。

非常感谢,我将尽快尝试此解决方案,并让您知道它是否有效。解决方案不起作用:我遇到此错误:类MyClass无法转换为java.util.Map
<class entity-name="entity_name" dynamic-update="true">
<composite-id name="id" class="CompositeId">
    <key-property name="first" column="Key1" type="string"/>
    <key-property name="second" column="Key2" type="string"/>
</composite-id>
    <property name="field1" column="field1" type="string"/>
    <property name="field2" column="field2" type="string"/>
    <property name="field3" column="field3" type="string"/>
    <property name="field4" column="field4" type="string"/>
    <property name="field5" column="field5" type="string"/>
    <property name="field6" column="field6" type="double"/>
    <property name="field7" column="field7" type="double"/>
</class>
<composite-id class="CompositeId" mapped="true">