2013-10-31 28 views
0

我正嘗試使用Hibernate將hashmap的值寫入數據庫。使用Hibernate向數據庫寫入HashMap

MY 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 

爲什麼我無法描述字段映射和key_key作爲HashMap中我希望他們像鍵值對單個字段。誰能幫幫我嗎 ?

回答

3

所以那裏去這樣做一對夫婦的方式。您可以將json字符串保存到代表鍵/值對的數據庫中。 如果你需要針對它作爲查詢的2013

{key: 'myKey', values:[{'1'},{'2'},{'3'}]} 

你可以堅持的java對象的BLOB(二進制對象)不使用JSON。

id number, 
map blob 

這將允許您將數據存儲在一列中。我推薦json字符串,因爲它不會強迫您在剩餘的生活中使用java,而其他人也可以使用您的數據。

+0

你能幫我把這個添加到我的代碼中嗎? – Newbie

+0

@Newbie在我這樣做之前,你打算對這些數據進行查詢嗎?地圖數據是? – Woot4Moo

+0

是的,我會嘗試查詢同時具有鍵和值的列。我們能做到嗎? – Newbie