Hibernate笔记之6数据关联多对一

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);
 }

}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值