问题描述:
一个人有家庭住址,也有单位地址;但是“地址”并不能失去人的存在而存在,所以是一个失去独立性的Pojo;
所以地址不能映射为一个实体,这时就需要映射为组件,及人的信息里边包含地址。是整体与部分的关系。
但由于这个地址可能有多个。比如公司地址、出生地址、家庭地址等。所以要使用Map,这样可以存储多个不同的
地址。key表明是什么地址;而value就是对应的这个地址。如何映射呢?
[java] view plaincopy
package com.ccay;
import java.util.Map;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
public class Person {
private int id;
private String name;
private Map<String,Address> address;
@ElementCollection
public Map<String, Address> getAddress() {
return address;
}
public void setAddress(Map<String, Address> address) {
this.address = address;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
[java] view plaincopy
package com.ccay;
import javax.persistence.Embeddable;
@Embeddable
public class Address {
/**
* 省
*/
private String a;
/**
* 市
*/
private String b;
/**
* 县
*/
private String c;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
}
[java] view plaincopy
package com.ccay;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
public class MyTest {
@Test
public void test(){
Configuration cfg = new AnnotationConfiguration().configure().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Person p = new Person();
p.setName("lala");
Address a= new Address();
a.setA("陕西");
a.setB("宝鸡");
a.setC("渭滨");
Address b= new Address();
b.setA("四川");
b.setB("成都");
b.setC("成都");
Map<String,Address> adds = new HashMap<String,Address>();
adds.put("family", a);
adds.put("company", b);
p.setAddress(adds);
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(p);
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
}
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;
反向工程图例:

857

被折叠的 条评论
为什么被折叠?



