使用Hibernate将HashMap写入数据库

时间:2013-10-31 11:52:06

标签: mysql hibernate

我正在尝试使用Hibernate将hashmap的值写入数据库。

我的POJO课程 包org.rahul;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;

@Entity
@Table(name = "hash")
public class HashMapExample {

  @Id
  @GeneratedValue
  private int id;

  @ElementCollection
  @MapKeyColumn(name = "key_key")
  @JoinTable(name = "example_attributes", joinColumns =
                                  @JoinColumn(name"example_id"))
  private Map<String, String> map = new HashMap<String, String>();

  public int getId() {
    return id;
  }

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

  public Map<String, String> getMap() {
    return map;
  }

  public void setMap(Map<String, String> map) {
    this.map = map;
  }

}

主类

package org.rahul.hibernate;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.rahul.HashMapExample;

public class HashMapMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SessionFactory sessionFactory = new AnnotationConfiguration()
                .configure("hibernate.cfg.xml").buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        String name = "Rahul";
        String company = "Memoir";

        Map<String, String> map = new HashMap<String, String>();
        map.put(name, company);
        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("XYZ", "ABC");

        HashMapExample hash = new HashMapExample();
        HashMapExample hash1 = new HashMapExample();

        // hash.setId(2);
        hash1.setMap(map);
        hash.setMap(map1);
        session.getTransaction();
        session.save(hash);
        session.save(hash1);
        session.getTransaction().commit();

    }
}

我希望得到一个包含键值对的列的表,但是我将键值作为不同的列。

example_attribut table description : 
  CREATE TABLE `example_attributes` 
  ( 
     `example_id` INT(11) NOT NULL, 
     `map`        VARCHAR(255) DEFAULT NULL, 
     `key_key`    VARCHAR(255) NOT NULL, 
     PRIMARY KEY (`example_id`, `key_key`), 
     KEY `fkea50c74c5cd44e54` (`example_id`), 
     CONSTRAINT `fkea50c74c5cd44e54` FOREIGN KEY (`example_id`) REFERENCES 
     `hash` (`id`) 
  ) 
engine=innodb 
DEFAULT charset=utf8

哈希表描述:

CREATE TABLE `hash` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

为什么我无法将字段map和key_key描述为hashmap?我希望它们像键值对一样位于单个字段中。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:3)

所以有几种方法可以做到这一点。您可以将json字符串保存到表示键/值对的数据库中。 如果您需要从2013年开始查询

,请不要使用json
{key: 'myKey', values:[{'1'},{'2'},{'3'}]}

您可以将java对象持久保存到blob(二进制对象)。

id number,
map blob

这将允许您将数据存储在一列中。我推荐使用json字符串,因为它不会强迫您在余生中使用java,而其他人也可以使用您的数据。