Hibernate数据关联是在Hibernate容器映射技术之上发展起来的。
Hibernate数据关联分为如下三种:
一对一(1:1)一个人拥有唯一身份证号
一对多(1:N)一个部门有很多员工
多对多(M:N)一个学生可以选很多课程,一门课程也可以有多个学生
一对一关联又包括如下两种类型:
1.主键关联
即两张关联表通过主键形成一对一映射关系
2.唯一外键关联
唯一外键关联其实就是多对一,实际开发中比较少见,但是不绝对哈,主要看项目。
首先是数据库:
-- 删除表
DROP TABLE person ;
DROP TABLE tgroup ;
-- 创建表
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)
) ;
commit ;
然后是POJO类:
package wjr.hibernate.demo23_26.associatedN1;
import java.util.Map;
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;
}
}
*******************************************
package wjr.hibernate.demo23_26.associatedN1;
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:
<hibernate-mapping>
<class name="wjr.hibernate.demo23_26.associatedN1.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="wjr.hibernate.demo23_26.associatedN1.TGroup" column="gid"
unique="true"
><!-- 使用unique,表示通过该属性为该字段添加唯一约束
同时,允许她作为Property-ref引用的目标。在TGroup.hbm.xml文件中有该引用 -->
</many-to-one>
</class>
</hibernate-mapping>
TGroup.hbm.xml:
<hibernate-mapping>
<class name="wjr.hibernate.demo23_26.associatedN1.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="wjr.hibernate.demo23_26.associatedN1.Person" property-ref="tgroup">
</one-to-one>
<!-- property-ref="tgroup"表示参考Person类中的tgroup属性。-->
</class>
</hibernate-mapping>
**************************************
最后是操作类:
package wjr.hibernate.demo23_26.associatedN1;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import wjr.hibernate.demo23_26.associatedN1.*;
public class PersonGroupOperate {
private Session session;
public PersonGroupOperate() {
this.session = new Configuration().configure().buildSessionFactory()
.openSession();
}
public void insert(Person per) {
this.session.save(per);
this.session.beginTransaction().commit();
}
public void insert(TGroup tg) {
this.session.save(tg);
this.session.beginTransaction().commit();
}
public static void main(String[] args) {
PersonGroupOperate pgo = new PersonGroupOperate();
Person per = new Person();
per.setName("LXH");
per.setAge(22);
TGroup tg = new TGroup();
tg.setName("MLDN.GUEST");
// 设置关系:一个人属于一个组
per.setTgroup(tg);
tg.setPerson(per);
//注意这里一定要先插组,再插人,因为是先有组,在有其中的成员Person。
pgo.insert(tg) ;
pgo.insert(per);
}
}