@ElementCollection 组件集合映射(一)

问题描述:

一个人有家庭住址,也有单位地址;但是“地址”并不能失去人的存在而存在,所以是一个失去独立性的Pojo;

所以地址不能映射为一个实体,这时就需要映射为组件,及人的信息里边包含地址。是整体与部分的关系。

但由于这个地址可能有多个。比如公司地址、出生地址、家庭地址等。所以要使用Map,这样可以存储多个不同的

地址。key表明是什么地址;而value就是对应的这个地址。如何映射呢?

[java] view plaincopy

  1. package com.ccay;  

  2. import java.util.Map;  

  3. import javax.persistence.ElementCollection;  

  4. import javax.persistence.Embedded;  

  5. import javax.persistence.Entity;  

  6. import javax.persistence.GeneratedValue;  

  7. import javax.persistence.Id;  

  8. @Entity   

  9. public class Person {  

  10.     private int id;  

  11.     private String name;  

  12.     private Map<String,Address> address;  

  13.       

  14.     @ElementCollection  

  15.     public Map<String, Address> getAddress() {  

  16.         return address;  

  17.     }  

  18.     public void setAddress(Map<String, Address> address) {  

  19.         this.address = address;  

  20.     }  

  21.     @Id  

  22.     @GeneratedValue  

  23.     public int getId() {  

  24.         return id;  

  25.     }  

  26.     public void setId(int id) {  

  27.         this.id = id;  

  28.     }  

  29.     public String getName() {  

  30.         return name;  

  31.     }  

  32.     public void setName(String name) {  

  33.         this.name = name;  

  34.     }  

  35. }  

 

[java] view plaincopy

  1. package com.ccay;  

  2. import javax.persistence.Embeddable;  

  3.   

  4. @Embeddable  

  5. public class Address {  

  6.     /** 

  7.      * 省 

  8.      */  

  9.     private String a;  

  10.     /** 

  11.      * 市 

  12.      */  

  13.     private String b;  

  14.     /** 

  15.      * 县 

  16.      */  

  17.     private String c;  

  18.     public String getA() {  

  19.         return a;  

  20.     }  

  21.     public void setA(String a) {  

  22.         this.a = a;  

  23.     }  

  24.     public String getB() {  

  25.         return b;  

  26.     }  

  27.     public void setB(String b) {  

  28.         this.b = b;  

  29.     }  

  30.     public String getC() {  

  31.         return c;  

  32.     }  

  33.     public void setC(String c) {  

  34.         this.c = c;  

  35.     }  

  36. }  

 

[java] view plaincopy

  1. package com.ccay;  

  2. import java.util.HashMap;  

  3. import java.util.Map;  

  4. import org.hibernate.SessionFactory;  

  5. import org.hibernate.cfg.AnnotationConfiguration;  

  6. import org.hibernate.cfg.Configuration;  

  7. import org.hibernate.classic.Session;  

  8. import org.junit.Test;  

  9.   

  10. public class MyTest {  

  11.       

  12.     @Test  

  13.     public void test(){  

  14.         Configuration cfg = new AnnotationConfiguration().configure().configure();    

  15.         SessionFactory sessionFactory = cfg.buildSessionFactory();  

  16.         Person p = new Person();  

  17.         p.setName("lala");  

  18.         Address a= new Address();  

  19.         a.setA("陕西");  

  20.         a.setB("宝鸡");  

  21.         a.setC("渭滨");  

  22.           

  23.         Address b= new Address();  

  24.         b.setA("四川");  

  25.         b.setB("成都");  

  26.         b.setC("成都");  

  27.           

  28.         Map<String,Address> adds = new HashMap<String,Address>();  

  29.           

  30.         adds.put("family", a);  

  31.         adds.put("company", b);  

  32.       

  33.         p.setAddress(adds);  

  34.         Session session = sessionFactory.openSession();  

  35.         session.beginTransaction();  

  36.             session.save(p);  

  37.             session.getTransaction().commit();  

  38.         session.close();  

  39.         sessionFactory.close();  

  40.     }  

  41.       

  42. }  

 

hibernate生成的建表语句:

 

CREATE TABLE `person` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 

 

 

CREATE TABLE `person_address` (

  `Person_id` int(11) NOT NULL,

  `a` varchar(255) DEFAULT NULL,

  `b` varchar(255) DEFAULT NULL,

  `c` varchar(255) DEFAULT NULL,

  `address_KEY` varchar(255) NOT NULL DEFAULT '',

  PRIMARY KEY (`Person_id`,`address_KEY`),

  KEY `FKE83F852A356FEAE3` (`Person_id`),

  CONSTRAINT `FKE83F852A356FEAE3` FOREIGN KEY (`Person_id`) REFERENCES `person` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

反向工程图例:

05144026_gGsY.gif

转载于:https://my.oschina.net/chaenomeles/blog/526495

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值