- 浏览: 21923 次
- 性别:
- 来自: 杭州
文章分类
最新评论
hibernate 映射关系
员工和部门对象创建如下:
publicclass Employee {
privateintid;
private String name;
private Department depart;
}
publicclass Department {
privateintid;
private String name;
}
Employee.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="Employee">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="native" />
</id>
<!-- 映射属性和字段 -->
<property name="name" column="NAME" length="50" />
<many-to-one name="depart" column="depart_id" ></many-to-one>
</class>
</hibernate-mapping>
Department.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="Department" table="Department">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="native" />
</id>
<!-- 映射属性和字段 -->
<property name="name" column="NAME" length="50" />
<!-- 集合放的class名 -->
<set name="emps">
<key column="depart_id"></key>
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
Employee 外键depart 来自 Department表的主键id;
Many to One 多个员工对应一个部门
需在类Employee 中添加 depart属性
private Department depart;
创建get,set方法
在多的一方Employee.hbm.xml 文档中创建
<many-to-one name="depart" column="depart_id" ></many-to-one>
name 指的是类中的属性
使用方法
static Department add()
{
Session s = null;
Transaction tx = null;
try{
Department depart = new Department();
depart.setName("depart name");
Employee emp = new Employee();
emp.setDepart(depart);//对象模型,建立两个对象关系
emp.setName("emp name");
s = HibernateUtil.getSession();
tx = s.beginTransaction();
/*s.save(depart);
s.save(emp);*/
//save顺序没关系,多了条update语句
s.save(emp);
s.save(depart);
tx.commit();
return depart;
}finally{
if(s != null)
s.close();
}
}
One to Many 一个部门对应多个员工
Department类中添加
private Set<Employee> emps; 并创建Get,Set方法。
Department.hbm.xml 中配置
<set name="emps">
<!-- 对应外键名称 -->
<key column="depart_id"></key>
<one-to-many class="Employee"/>
</set>
测试代码
static Department add()
{
Session s = null;
Transaction tx = null;
try{
Department depart = new Department();
depart.setName("depart name");
Employee emp1 = new Employee();
emp1.setDepart(depart);//对象模型,建立两个对象关系
emp1.setName("emp name1");
Employee emp2 = new Employee();
emp2.setDepart(depart);//对象模型,建立两个对象关系
emp2.setName("emp name2");
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(emp1);
s.save(emp2);
s.save(depart);
tx.commit();
return depart;
}finally{
if(s != null)
s.close();
}
}
static Department query(int departId)
{
Session s = null;
try{
s = HibernateUtil.getSession();
Department depart = (Department) s.get(Department.class, departId);
System.out.println("emp size:" + depart.getEmps().size());
return depart;
}finally{
if(s != null)
s.close();
}
}
基于主键One to One 主对象从对象
publicclass Person {
privateintid;
private String name;
private IdCard idCard;
}
publicclass IdCard {
privateintid;
private Date usefulLife;
private Person person;
}
Person.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="Person" table="Person">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="native" />
</id>
<!-- 映射属性和字段 -->
<property name="name" column="NAME" length="50" />
<one-to-one name="idCard"></one-to-one>
</class>
</hibernate-mapping>
IdCard.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="IdCard" table="id_card">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<!-- 映射属性和字段 -->
<property name="usefulLife" column="usefulLife" length="50" />
<one-to-one name="person" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
constrained="true" 该属性等于true,约束表中的外键关系。
测试用例:
static Person add()
{
Session s = null;
Transaction tx = null;
try{
s = HibernateUtil.getSession();
IdCard idCard = new IdCard();
idCard.setUsefulLife(new Date());
Person p = new Person();
p.setName("p1");
p.setIdCard(idCard);
//这句话很关键,起到连接的作用
idCard.setPerson(p);
tx = s.beginTransaction();
s.save(p);
s.save(idCard);
tx.commit();
return p;
}finally
{
if(s != null)
{
s.close();
}
}
}
可以只保存Person对象,但要保存idCard对象,一定要设置
idCard.setPerson(p);
基于外键的One to One
与多对一类似,需要加上唯一约束
IdCard.hbm.xml 修改
<generator class="native"></generator>
<many-to-one name="person" column=”person_id” unique="true"></many-to-one>
Person.hbm.xml 修改
<one-to-one name="idCard" property-ref="person"></one-to-one>
多对多 many to many
老师和学生的多对多的关系
publicclass Teacher {
privateintid;
private String name;
private Set<Student> students;
}
Teacher.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="Teacher">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="native" />
</id>
<!-- 映射属性和字段 -->
<property name="name" column="NAME" length="50" />
<!-- 集合放的class名 -->
<set name="students" table="teacher_student">
<key column="teacher_id"></key>
<many-to-many class="Student" column="student_id"/>
</set>
</class>
</hibernate-mapping>
我们最终的目的是:获取student表信息。
中间有一张关联表,首先通过teacher_id,获取teacher_student表信息,然后通过student_id获取student表信息。
Student类
publicclass Student {
privateintid;
private String name;
private Set<Teacher> teachers;
}
Student.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="Student">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="native" />
</id>
<!-- 映射属性和字段 -->
<property name="name" column="NAME" length="50"/>
<!-- 集合放的class名 -->
<set name="teachers" table="teacher_student">
<key column="student_id" />
<many-to-many class="Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
测试代码:
老师来维护中间表操作
package cn.hibernate.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
import cn.hibernate.pojo.Student;
import cn.hibernate.pojo.Teacher;
public class Many2Many {
public static void main(String[] args) {
add();
}
static void add()
{
Session s = null;
Transaction tx = null;
try{
Set<Student> ss = new HashSet<Student>();
Teacher t1 = new Teacher();
t1.setName("t1 name");
Teacher t2 = new Teacher();
t2.setName("t2 name");
Student s1 = new Student();
s1.setName("s1 name");
Student s2 = new Student();
s1.setName("s2 name");
ss.add(s1);
ss.add(s2);
//老师维护关系,插入数据,不能两方来维护。
t1.setStudents(ss);
t2.setStudents(ss);
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(t1);
s.save(t2);
s.save(s1);
s.save(s2);
tx.commit();
}finally{
if(s != null)
{
s.close();
}
}
}
}
学生维护中间表关系
package cn.hibernate.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
import cn.hibernate.pojo.Student;
import cn.hibernate.pojo.Teacher;
publicclass Many2Many {
publicstaticvoid main(String[] args) {
add();
}
staticvoid add()
{
Session s = null;
Transaction tx = null;
try{
Set<Teacher> ts = new HashSet<Teacher>();
Teacher t1 = new Teacher();
t1.setName("t1 name");
Teacher t2 = new Teacher();
t2.setName("t2 name");
ts.add(t1);
ts.add(t2);
Student s1 = new Student();
s1.setName("s1 name");
Student s2 = new Student();
s1.setName("s2 name");
//学生维护中间表关系
s1.setTeachers(ts);
s2.setTeachers(ts);
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(s1);
s.save(s2);
s.save(t1);
s.save(t2);
tx.commit();
}finally{
if(s != null)
{
s.close();
}
}
}
}
代码中只能由一方维护数据,不可双方共同维护,否则,插入重复异常。
两个对象之间的关联组件关系映射
public class Name(){
private String firstName;
private String lastName;
}
public class User(){
private int id;
private Name name;
}
User.hbm.xml
<hibernate-mapping package="cn.hibernate.pojo">
<!-- 映射类和数据表 -->
<class name="User" table="User">
<!-- 映射 OID 和数据表的主键 -->
<id name="id" column="ID">
<generator class="native" />
</id>
<component name="name">
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
</component>
<property name="age" column="age" type="integer"/>
</class>
</hibernate-mapping>
测试代码:
staticvoid add()
{
Session s= null;
Transaction tx = null;
try{
s = HibernateUtil.getSession();
tx = s.beginTransaction();
Name name = new Name();
name.setFirstName("firstName");
name.setLastName("lastName");
User user = new User();
user.setName(name);
user.setAge(18);
s.save(user);
tx.commit();
}finally{
if(s != null)
{
s.close();
}
}
}
一对一缺省情况下,关联查。其他分两次查。
相关推荐
标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...
在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用 Java 对象来操作数据库,而无需直接编写 SQL 语句。本文将深入讲解 Hibernate 中的映射关系,特别是如何实现一对一(One-to-One)的关联映射。 ...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
hibernate开发的关系: one-to-one,many-to-one,many-to-many学习经验总结
hibernate中oneTOone,one to many等映射关系代码
关于hibernate的关联操作 分享下
hibernate表映射一直记不住,这次总结一下,放便下次使用。。。
对Hibernate映射关系详细总结,可以帮助你学习Hibernate知识
在Java持久化框架Hibernate中,映射关系是数据库表与对象模型之间的一种关联方式,它使得数据操作可以更加便捷地在对象层面上进行。本文将深入探讨Hibernate中的三种主要映射关系:一对一(One-to-One)、一对多...
Hibernate对象关系映射一对多 很基础等文档
这个名为“Hibernate映射解析 七种映射关系 后端 - Java”的压缩包文件显然包含了关于Hibernate映射关系的详细讲解。让我们深入探讨一下Hibernate的映射解析及其七种主要的映射关系。 首先,Hibernate通过XML映射...
Hibernate 是一个流行的对象关系映射(ORM)...正确配置映射关系能够提升应用程序的性能和可维护性,避免出现不必要的 N+1 查询问题,并简化数据库交互的复杂性。在实际开发中,应根据业务需求灵活选择合适的映射方式。
hibernate 映射关系 小结
本主题聚焦于“用Hibernate映射继承关系”,我们将深入探讨Hibernate如何处理对象的继承层次结构,并将其映射到数据库中的表。 Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表...
Hibernate4中映射关系图解。