Hibernate中的数据关联主要分为三大类:
1对1: 一个人对应一个身份证
1对多,多对1: 一个人有很多联系地址 ,多个用户拥有一个权限
多对多: 一个学生可以对应选很多门课,一门课可以对应有许多学生
一.1对1关系 --主键关联
一个人对应一个身份证
表结构:
-- 创建表CREATE TABLE person( id VARCHAR(32) NOT NULL PRIMARY KEY , name VARCHAR(20) NOT NULL , age int) ;CREATE TABLE idcard( id VARCHAR(32) , serial VARCHAR(18) NOT NULL , expiry int , FOREIGN KEY(id) REFERENCES person(id) ON DELETE CASCADE ) ;
Person.java
public class Person { private String id ; private String name ; private Integer age ; private IDCard idCard ; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IDCard getIdCard() { return idCard; } public void setIdCard(IDCard idCard) { this.idCard = idCard; } }
IDCard.java
public class IDCard { private String id ; private String serial; private Integer expiry; private Person person; public Integer getExpiry() { return expiry; } public void setExpiry(Integer expiry) { this.expiry = expiry; } public String getSerial() { return serial; } public void setSerial(String serial) { this.serial = serial; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
Person.hbm.xml 关联主表
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo04.pojo.Person" table="person"> <id name="id" type="java.lang.String"> <column name="id" length="32" /> <generator class="uuid.hex"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <property name="age" type="java.lang.Integer"> <column name="age" /> </property> <one-to-one name="idCard" class="org.lxh.hibernate.demo04.pojo.IDCard" cascade="all" outer-join="true"> </one-to-one> </class> </hibernate-mapping>
Idcard.hbm.xml 关联从表
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo04.pojo.IDCard" table="idcard"> <id name="id" column="id" type="java.lang.String"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <one-to-one name="person" class="org.lxh.hibernate.demo04.pojo.Person" constrained="true"> </one-to-one> <property name="serial" type="java.lang.String"> <column name="serial" length="18" not-null="true" /> </property> <property name="expiry" type="java.lang.Integer"> <column name="expiry" not-null="true" /> </property> </class> </hibernate-mapping>
插入代码示例:
PersonIDCardOperation po = new PersonIDCardOperation(); // 设置人的信息 Person per = new Person() ; per.setName("lxh"); per.setAge(new Integer(20)); // 设置身份证信息 IDCard ic = new IDCard(); ic.setSerial("888888888888888"); ic.setExpiry(12); per.setIdCard(ic); ic.setPerson(per); po.insert(per) ;
二. 1对多,多对1关系 --外键关联
1.1对多关系
一个人有很多联系地址
表结构
CREATE TABLE person( pid VARCHAR(32) NOT NULL PRIMARY KEY , name VARCHAR(20) NOT NULL , age INT) ;
CREATE TABLE address( aid VARCHAR(32) NOT NULL PRIMARY KEY , name VARCHAR(50) NOT NULL , zipcode VARCHAR(10) NOT NULL , pid VARCHAR(32) , FOREIGN KEY (aid) REFERENCES person(pid) ON DELETE CASCADE) ;
Person.java
import java.util.Set; public class Person { private String pid ; private String name ; private int age ; private Set address ; public Set getAddress() { return address; } public void setAddress(Set address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } }
Address.java
public class Address { private String aid ; private String name ; private String zipcode ; private Person person ; public String getAid() { return aid; } public void setAid(String aid) { this.aid = aid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } }
Person.hbm.xml 关联主表
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo06.pojo.Person" table="person" catalog="mldn"> <id name="pid" type="java.lang.String"> <column name="pid" length="32" /> <generator class="uuid.hex"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <property name="age" type="java.lang.Integer"> <column name="age" /> </property> <set name="address" table="address" cascade="all" inverse="true"> <key> <column name="pid" length="32" /> </key> <one-to-many class="org.lxh.hibernate.demo06.pojo.Address" /> </set> </class> </hibernate-mapping>
Address.hbm.xml 关联从表
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo06.pojo.Address" table="address" catalog="mldn"> <id name="aid" type="java.lang.String"> <column name="aid" length="32" /> <generator class="uuid.hex"></generator> </id> <many-to-one name="person" class="org.lxh.hibernate.demo06.pojo.Person"> <column name="pid" length="32" /> </many-to-one> <property name="name" type="java.lang.String"> <column name="name" length="50" not-null="true" /> </property> <property name="zipcode" type="java.lang.String"> <column name="zipcode" length="10" not-null="true" /> </property> </class> </hibernate-mapping>
2.多对一关系
多个用户拥有一个权限
表结构
-- 创建表CREATE TABLE person( id VARCHAR(32) PRIMARY KEY NOT NULL , name VARCHAR(20) NOT NULL , age INT , gid VARCHAR(32)) ;
CREATE TABLE TGROUP( gid VARCHAR(32) PRIMARY KEY NOT NULL, name VARCHAR(20)) ;
Person.java
public class Person { private String id ; private String name ; private int age ; private TGroup tgroup ; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public TGroup getTgroup() { return tgroup; } public void setTgroup(TGroup tgroup) { this.tgroup = tgroup; } }
TGroup.java
public class TGroup { private String gid ; private String name ; private Person person ; public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public String getGid() { return gid; } public void setGid(String gid) { this.gid = gid; } }
Person.hbm.xml 关联主表
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo05.pojo.Person" table="person"> <id name="id" type="java.lang.String"> <column name="id" length="32" /> <generator class="uuid.hex"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <property name="age" type="java.lang.Integer"> <column name="age" /> </property> <many-to-one name="tgroup" class="org.lxh.hibernate.demo05.pojo.TGroup" column="gid" unique="true"> </many-to-one> </class> </hibernate-mapping>
TGroup.hbm.xml 关联从表
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo05.pojo.TGroup" table="tgroup"> <id name="gid" type="java.lang.String"> <column name="gid" length="32" /> <generator class="uuid.hex"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <one-to-one name="person" class="org.lxh.hibernate.demo05.pojo.Person" property-ref="tgroup"> </one-to-one> </class> </hibernate-mapping>
一对多是将映射关系写在一的一端,多对一是将映射关系写在多的一端。一对多和多对一的映射策略是一致的,都是通过在"多"的一端添加一个外键指向"一"的一端,只是站的角度不同。
不管多对一还是一对多,都是在"多"的一端添加一个外键指向"一"的一端,只不过是多对一是在多的一端为其自己添外键,而一对多则是在一的一端为多的一端添加外主键。
3.多对多关系
一个学生可以对应选很多门课,一门课可以对应有许多学生
表结构
CREATE TABLE person( pid VARCHAR(32) NOT NULL PRIMARY KEY , name VARCHAR(20) NOT NULL , age INT) ;CREATE TABLE server( sid VARCHAR(32) NOT NULL PRIMARY KEY , name VARCHAR(20) NOT NULL ) ;CREATE TABLE person_server( pid VARCHAR(32) , sid VARCHAR(32) , FOREIGN KEY (pid) REFERENCES person(pid) ON DELETE CASCADE , FOREIGN KEY (sid) REFERENCES server(sid) ON DELETE CASCADE) ;
Person.java
public class Person { private String pid ; private String name ; private int age ; private Set servers ; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public Set getServers() { return servers; } public void setServers(Set servers) { this.servers = servers; } }
Server.java
import java.util.Set; public class Server { private String sid ; private String name ; private Set persons ; public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getPersons() { return persons; } public void setPersons(Set persons) { this.persons = persons; } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } }
Person.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo07.pojo.Person" table="person"> <id name="pid" type="java.lang.String"> <column name="pid" length="32" /> <generator class="uuid.hex"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <property name="age" type="java.lang.Integer"> <column name="age" /> </property> <set name="servers" table="person_server" cascade="all"> <key column="pid"></key> <many-to-many class="org.lxh.hibernate.demo07.pojo.Server" column="sid"> </many-to-many> </set> </class> </hibernate-mapping>
Server.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lxh.hibernate.demo07.pojo.Server" table="server"> <id name="sid" type="java.lang.String"> <column name="sid" length="32" /> <generator class="uuid.hex" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <set name="persons" table="person_server" cascade="all"> <key column="sid"></key> <many-to-many class="org.lxh.hibernate.demo07.pojo.Person" column="pid"> </many-to-many> </set> </class> </hibernate-mapping>