关联映射
多对一(Employee - Department)
一对多(Department-Employee)
一对一(Person - IDCard)
多对多(teacher - student)
组件映射(User-Name)
集合映射(set, list, map, bag)
inverse和cascade(Employee – Department)
 
多对一(Employee - Department)
映射文件<many-to-one name=”depart” column=”depart_id”/>
ER图
 
举例:
Department.java

package com.dzq.domain;

import java.io.Serializable;
import java.util.Set; public class Department implements Serializable{
private int id;
private String name;
private Set<Employee> empls;
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;
} public Set<Employee> getEmpls() {
return empls;
} public void setEmpls(Set<Employee> empls) {
this.empls = empls;
} }

Employee.java

package com.dzq.domain;

import java.io.Serializable;

public class Employee implements Serializable{
private int id;
private String name;
private Department depart; 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;
} public Department getDepart() {
return depart;
} public void setDepart(Department depart) {
this.depart = depart;
} }

Department.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Department" table="department">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
</class> </hibernate-mapping>

  


Employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Employee" table="employee">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<many-to-one name="depart" column="depart_id" />
</class> </hibernate-mapping>

  测试代码:

public static void addEmAndDe(){
Employee em=new Employee();
Department depart=new Department();
depart.setName("FBI");
em.setDepart(depart);
em.setName("AK47");
HibernateUntils.add(depart);
HibernateUntils.add(em);
}

  

一对多(Department-Employee)
<set name=”employees”>
<key column=”depart_id”/>
<one-to-many class=”Employee”/>
</set>

  

一对一(Person - IdCard)
1)基于主键的one-to-one(person的映射文件)
<id name=”id”>
<generator class=”foreign”><param name=”property”>idCard</param></generator>
<id>
<one-to-one name=”idCard” constrained=”true”/>

例子:

Person.java  主对象

package com.dzq.domain;

import java.io.Serializable;

public class Person  implements Serializable{
private int id;
private String name;
private IDCard idcard; 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;
} public IDCard getIdcard() {
return idcard;
} public void setIdcard(IDCard idcard) {
this.idcard = idcard;
} }

IDCard.java 从对象

package com.dzq.domain;

import java.io.Serializable;

public class IDCard  implements Serializable{
private int id;
private String name;
private Person person; 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;
} public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
} }

IDCard.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="IDCard" table="id_card">
<id name="id" column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="name" column="name" />
<one-to-one name="person" constrained="true"/>
</class> </hibernate-mapping>

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Person" table="person">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<one-to-one name="idcard"/>
</class> </hibernate-mapping>

测试代码:

OneToOne.java

package com.dzq.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import com.dzq.domain.IDCard;
import com.dzq.domain.Person;
import com.dzq.utils.HibernateUntils; public class OneToOne {
public static void main(String[] args) {
add();
queryPerson(1);
queryIDcard(1);
} public static Person add(){
Session s=null;
Transaction ts=null;
try {
s=HibernateUntils.getSession();
Person p=new Person();
IDCard idcard=new IDCard();
idcard.setName("0606");
p.setName("ll");
p.setIdcard(idcard);
idcard.setPerson(p);
ts=s.beginTransaction();
s.save(p);
s.save(idcard);
ts.commit();
return p;
} catch (Exception e) {
if(ts!=null)
ts.rollback();
throw new RuntimeException(e);
}finally{
if(s!=null){
s.close();
}
}
} /**
* 查询主对象,用连接表查询
* @param id
* @return
*/
public static Person queryPerson(int id){
Session s=null;
try {
s=HibernateUntils.getSession();
Person p=(Person) s.get(Person.class, id);
System.out.println(p.getIdcard().getName());
return p;
} finally{
if(s!=null){
s.close();
}
}
}
/**
* 查询从对象,查询两次
* @param id
* @return
*/
public static IDCard queryIDcard(int id){
Session s=null;
try {
s=HibernateUntils.getSession();
IDCard idc= (IDCard) s.get(IDCard.class, id);
System.out.println(idc.getPerson().getName());
return idc;
} finally{
if(s!=null){
s.close();
}
}
}
}
2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束
<one-to-one name=”idCard” property-ref=“person”/>
<!-property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应 -->
<many-to-one name=”person” column=”person_id” unique=”true” not-null=”true”/>
 <!-唯一的多对一,其实就便成了一对一了-->

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="IDCard" table="id_card">
<id name="id" column="id">
<!-- <generator class="foreign">
<param name="property">person</param>
</generator> -->
<generator class="native"/>
</id>
<property name="name" column="name" />
<!-- <one-to-one name="person" constrained="true"/> -->
<many-to-one name="person" column="person_id" unique="true"/>
</class> </hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Person" table="person">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<!-- <one-to-one name="idcard"/> -->
<one-to-one name="idcard" property-ref="person"/>
</class> </hibernate-mapping>
多对多(teacher - student)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
<set name="teacher" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
l

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Student" table="student">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<set name="teachers" table="teacher_student">
<key column="student_id"/>
<many-to-many class="Teacher" column="teacher_id"/>
</set>
</class> </hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Teacher" table="teacher">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<set name="students" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
</class> </hibernate-mapping>
package com.dzq.test;

import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.Transaction; import com.dzq.domain.Student;
import com.dzq.domain.Teacher;
import com.dzq.utils.HibernateUntils; public class ManyToMany { public static void main(String[] args) {
add();
query(1);
} public static void add(){
Session s=null;
Transaction ts=null;
try {
Set<Teacher> tes=new HashSet<Teacher>();
Set<Student> stus=new HashSet<Student>();
s=HibernateUntils.getSession();
Teacher t1=new Teacher();
t1.setName("gao");
Teacher t2=new Teacher();
t2.setName("gaoji");
tes.add(t1);
tes.add(t2);
Student s1=new Student();
s1.setName("hu");
Student s2=new Student();
s2.setName("xiaohu");
stus.add(s1);
stus.add(s2);
t1.setStudents(stus);
t2.setStudents(stus);
/*s1.setTeachers(tes);
s2.setTeachers(tes);*/ // 会报错,插入重复,要一个就行
ts=s.beginTransaction();
s.save(t1);
s.save(t2);
s.save(s1);
s.save(s2);
ts.commit();
} catch (Exception e) {
if(ts!=null)
ts.rollback();
throw new RuntimeException(e);
}finally{
if(s!=null){
s.close();
}
}
}
/**
* 多对多查询,效率很低,用的比较少,最好使用分页查询,数据量很小才会使用,数据大量是会存在很严重的性能问题
* @param id
*/ public static void query(int id){
Session s=null;
try {
s=HibernateUntils.getSession();
Teacher teacher=(Teacher) s.get(Teacher.class, id);
System.out.println(teacher.getStudents().size());
} finally{
if(s!=null){
s.close();
}
}
} }
组件映射(User-Name)
关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。
<component name=”name” class=”com.test.hibernate.domain.Name”>
<property name=”initial”/>
<property name=”first”/>
<property name=”last”/>
</component>
当组件的属性不能和表中的字段简单对应的时候可以选择实现:
org.hibernate.usertype. UserType或
org.hibernate.usertype. CompositeUserType

package com.dzq.domain;

public class Name {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} }

只会产生一张表

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="User" table="user">
<id name="id" column="id">
<generator class="native" />
</id>
<!-- <property name="username" column="username" /> -->
<component name="username">
<property name="firstName" column="first_name"/>
<property name="lastName" column="last_name"/>
</component>
<property name="password" column="password" />
<property name="mobile" column="mobile" />
<property name="regdate" column="regdate"/>
</class> </hibernate-mapping>

关联关系的级联操作

package com.dzq.test;

import java.util.HashSet;
import java.util.Set; import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction; import com.dzq.domain.Department;
import com.dzq.domain.Employee;
import com.dzq.utils.HibernateUntils; public class ManyToOne { public static void main(String[] args) {
add();
}
public static void addEmAndDe(){
Employee em=new Employee();
Department depart=new Department();
depart.setName("FBI");
em.setDepart(depart);
em.setName("AK47");
HibernateUntils.add(depart);
HibernateUntils.add(em);
} public static void add(){
Session s=null;
Transaction ts=null;
try { Department dep=new Department();
dep.setName("FBI");
Employee e1=new Employee();
Employee e2=new Employee();
e1.setName("hi");
e1.setDepart(dep);
e2.setName("hello");
e2.setDepart(dep);
Set<Employee> empls=new HashSet<Employee>();
empls.add(e1);
empls.add(e2);
dep.setEmpls(empls);
s=HibernateUntils.getSession();
ts=s.beginTransaction();
//s.save(e1);
//s.save(e2);
s.save(dep);
ts.commit();
} catch (Exception e) {
ts.rollback();
throw new RuntimeException(e);
}finally{
if(s!=null){
s.close();
}
}
} }
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.dzq.domain"> <class name="Department" table="department">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<set name="empls" cascade="save-update">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
<!-- <list name="empls">
<key column="depart_id"/>
<list-index column="order_col"/>
<one-to-many class="Employee"/>
</list> --> <!-- <bag name="empls">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</bag>
--> </class> </hibernate-mapping>
 

20160507-hibernate入门的更多相关文章

  1. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

  2. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  3. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  4. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  5. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

  6. Hibernate入门4.核心技能

    Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...

  7. Hibernate入门3.配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  8. 简单的Hibernate入门简介

    其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...

  9. Hibernate入门(1)-第一个Hibernate程序

    Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...

  10. hibernate入门之person表

    下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...

随机推荐

  1. QQMusic绿钻兄,你可安好?我需要晴天。

    不好意思,年纪这样大了,还依靠吐槽来保持呆毛的正能量,实在对不住,先说对不起. QQMusic是我最喜欢的腾讯增值服务,正版内容,海量歌手,高清下载.实在是音乐软件中高大上的典范,除了歌手排名中前十中 ...

  2. windows主机mysql忘记密码如何重置

    本文主要是针对mysql重置密码过程中出现“mysqld不是内部命令或外部命令”的问题而写的.网上有很多关于mysql忘记密码了如何找回的文章,但是很多说的都不够详细,特别是还要用到DOS命令,可能这 ...

  3. 独树一帜的字符串匹配算法——RK算法

    参加了雅虎2015校招,笔试成绩还不错,谁知初面第一题就被问了个字符串匹配,要求不能使用KMP,但要和KMP一样优,当时瞬间就呵呵了.后经过面试官的一再提示,也还是没有成功在面试现场写得.现将该算法记 ...

  4. jquery-ui 之draggable详解

    举一个例子: <div class="box"> <div id="draggable"> <p>Drag me aroun ...

  5. Android项目实战--手机卫士24--程序锁的实现以及逻辑

    昨天我们已经把程序全部读取出来,显示到界面上了,那今天,我们就来讲一下那个程序锁的实现啦.其实也很简单啦,我们主要就是把用户要锁定的程序放到一个表里面,然后就监听手机里面的任务栈,如果发现任务栈里面出 ...

  6. js基础知识总结(全)

    1.js版HelloWorld <script type="text/javascript"> alert("HelloWorld"); </ ...

  7. 常用 Unicode 符号列表

    Unicode 中包含了各种符号,我们可以作为图标来使用.这里整理一下常用的一些符号. 一.拉丁字母补全(Latin-1 Supplement):U+0080 至 U+00FF Unicode 编号 ...

  8. eclispe搭建android平台

    1.不推荐在线安装android ADT,因为需要FQ.可以在网上下载ADT,然后离线安装. 离线安装方式:help->Install ->点击add然后选择你的安装包(不需要解压),一直 ...

  9. Spring3 MVC Login Interceptor(Spring 拦截器)

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. setsockopt()使用方法(參数具体说明)

    int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套接字): 指向一个打开的套接口描写叙述 ...