Hibernate对象映射关系:多对一

一:项目截图

二:业务代码

package com.cloud.domain;

import java.util.Set;

public class Department implements java.io.Serializable{

/**

* 实现java.io.Serializable 接口的类是可序列化的。

* 没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。

*/

private static final long seriaVersionUID = 1L;

private Integer id;

private String name;

//设置一个集合,对应多个学生:one-to-many

private Set<Student> stu;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Set<Student> getStu() {

return stu;

}

public void setStu(Set<Student> stu) {

this.stu = stu;

}

public static long getSeriaversionuid() {

return seriaVersionUID;

}

}

package com.cloud.domain;

public class Student implements java.io.Serializable{

/**

* 实现java.io.Serializable 接口的类是可序列化的。

* 没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。

*/

private static final long seriaVersionUID = 1L;

private Integer id;

private String name;

private Department dept;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Department getDept() {

return dept;

}

public void setDept(Department dept) {

this.dept = dept;

}

public static long getSeriaversionuid() {

return seriaVersionUID;

}

}

三:项目配置代码

Department.hbm.xml

<?xml
version="1.0"encoding="utf-8"?>

<!DOCTYPE
hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping
package="com.cloud.domain">

<class
name="Department">

<!--配置主键属性 -->

<id
name="id"type="java.lang.Integer">

<!--
配置生成策略 -->

<generator
class="increment"/>

</id>

<property
name="name"type="java.lang.String">

<column
name="name"
length="64"not-null="true"/>

</property>

<!--
配置one-to-many关系 -->

<set name="stu"cascade="save-update">

<!--
指定Student类对应的外键 -->

<key
column="dept_id"/>

<one-to-many
class="Student"/>

</set>

</class>

</hibernate-mapping>

Student.hbm.xml

<?xml
version="1.0"encoding="utf-8"?>

<!DOCTYPE
hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping
package="com.cloud.domain">

<class
name="Student">

<id
name="id"type="java.lang.Integer">

<generator
class="increment"/>

</id>

<!-- property是指业务逻辑代码里面的属性 -->

<property
name="name"
type="java.lang.String">

<!-- column是指在数据库表中生成的列名 -->

<column
name="name"
length="64"/>

</property>

<!-- private Department
dept;对于Student中该属性不能使用property配置 -->

<!--
因为多个学生对应一个部门,所以这里使用 many-to-one配置 -->

<many-to-one
name="dept"column="dept_id"/>

</class>

</hibernate-mapping>

Hibernate.cfg.xml

<?xml
version=‘1.0‘
encoding=‘UTF-8‘?>

<!DOCTYPE
hibernate-configuration
PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse
HibernateTools.                   -->

<hibernate-configuration>

<session-factory>

<property
name="dialect">

org.hibernate.dialect.MySQLDialect

</property>

<property
name="connection.url">

jdbc:mysql://localhost:3306/zjgm01

</property>

<property
name="connection.username">root</property>

<property
name="connection.password">root</property>

<property
name="connection.driver_class">

com.mysql.jdbc.Driver

</property>

<property
name="show_sql">true</property>

<!--
配置hibernate自动创建关系模型表 -->

<property
name="hbm2ddl.auto">update</property>

<mapping
resource="com/cloud/domain/Department.hbm.xml"/>

<mapping
resource="com/cloud/domain/Student.hbm.xml"
/>

</session-factory>

</hibernate-configuration>

四:测试代码

package com.cloud.view;

import java.util.HashSet;

import java.util.Set;

import org.hibernate.Hibernate;

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.cloud.domain.Department;

import com.cloud.domain.Student;

import com.cloud.util.HibernateUtil;

public class TestMain {

/**

* @param args

*/

public static void main(String[] args) {

Session s=null;

Transaction tx=null;

try {

s=HibernateUtil.getCurrentSession();

tx=s.beginTransaction();

//取出1号部门的所有学生,方法一

//String hql="from Student where dept.id=1";

//方法二one-to-many关系

/*

Department department1=(Department) s.get(Department.class, 1);

//取出该部门的学生

Set<Student> stus=department1.getStu();

for(Student ss:stus){

System.out.println(ss.getName());

}

*/

//添加学生

Department department=new Department();

department.setName("业务部门");

Student stu1=new Student();

stu1.setName("大明");

Student stu2=new Student();

stu2.setName("小明");

Set sets=new HashSet<Student>();

sets.add(stu1);

sets.add(stu2);

department.setStu(sets);

s.save(department);

tx.commit();

} catch (Exception e) {

if(tx!=null){

tx.rollback();

}

}finally{

if(s!=null && s.isOpen()){

s.close();

}

}

}

public static Student getStudent() {

Session s=null;

Transaction tx=null;

Student student1=null;

try {

s=HibernateUtil.getCurrentSession();

tx=s.beginTransaction();

student1=(Student) s.get(Student.class, 3);

//System.out.println(student1.getName()+"所在部门:"+student1.getDept().getName());

//显示初始化代理对象

Hibernate.initialize(student1.getDept());

tx.commit();

} catch (Exception e) {

if(tx!=null){

tx.rollback();

}

}finally{

if(s!=null && s.isOpen()){

s.close();

}

}

return student1;

}

public static void add() {

//HibernateUtil.getCurrentSession();

Session s=null;

Transaction tx=null;

try {

s=HibernateUtil.getCurrentSession();

tx=s.beginTransaction();

//添加一个学生和部门,并且把学生关联到部门当中

Student stu=new Student();

stu.setName("张三");

Student stu2=new Student();

stu2.setName("李四");

Department d=new Department();

d.setName("财务部");

Department d2=new Department();

d2.setName("人事部");

//把学生分配到部门当中去

stu.setDept(d);

//这里必须注意保存时必须先保存部门再保存学生

s.save(d);

s.save(stu);

stu2.setDept(d2);

s.save(d2);

s.save(stu2);

tx.commit();

} catch (Exception e) {

if(tx!=null){

tx.rollback();

}

}finally{

if(s!=null && s.isOpen()){

s.close();

}

}

}

}

五:测试结果

Hibernate: select max(id) from Department

Hibernate: select max(id) from Student

Hibernate: insert into Department (name, id) values (?, ?)

Hibernate: insert into Student (name, dept_id, id) values (?, ?, ?)

Hibernate: insert into Student (name, dept_id, id) values (?, ?, ?)

Hibernate: update Student set dept_id=? where id=?

Hibernate: update Student set dept_id=? where id=?

版权声明:博主原创文章,转载请说明出处。http://blog.csdn.net/dzy21

时间: 2024-07-31 14:45:10

Hibernate对象映射关系:多对一的相关文章

Hibernate对象映射关系:一对一

一:项目截图 二:业务代码 package com.cloud.domain; import java.util.Date; public class IdCard { private Integer id; private Date validateDte; private Person person; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Dat

Hibernate映射关系-多对多

接着上几篇博客,hibernate的映射关系,今天我们说说基本关系的最后一种:多对多. 一 .多对多关系 现象:多对多关系,在生活中很常见,就那学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择.还有就是一个用户可以有多个角色,一个角色可以有多个人,等等这样的例子很多. hibernate实现:多对多关联关系采用第三张表的方式来实现,将多对多转化为两个一对多. 当然,多对多也是有方向的.拿用户--角色来画类图. 1.单向关联--用户关联角色 多对多关系在hbm文

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l

Hibernate基数映射关系

Hibernate基数映射关系 一.基数映射——一对一关系映射 每个账户对应一个地址的数据库关系为例: 1.SQL脚本:    -- 一对一(唯一外键)    drop table t_addr;    drop table t_act;    create table t_act(       id int primary key auto_increment,       actNo varchar(50) not null unique,       passwd varchar(50)

java框架篇---hibernate(一对一)映射关系

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从一种形式转换到另外一种形式. 面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据.内存中的对象之间存在关联和继承关系,而在数据库中,关系数

Hibernate关联映射关系

一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实体类(Emp(员工),Dept(部门)) /* * 员工实体类 */public class Emp { private Integer empId; //员工编号 private String empName; //员工姓名 private Dept dept; //所处部门 //get(),set()方法省略 } /* * 部

Hibernate One2Many映射关系

多对一映射与一对多映射: 使用部门和员工的关系来说明问题.一个部门可以有多个员工,但是一个员工只属于一个部门. 开发步骤: (1)JavaBean的设计,Dept(部门表) Employee(员工表) (2)映射关系 (3)测试 1.Dept和Employee Javabean Dept package cn.itcast.one2many; import java.util.HashSet; import java.util.Set; public class Dept { private i

Hibernate many2many映射关系

多对多映射关系: 开发步骤: JavaBean 映射文件  测试 图片详解: 1.javaBean  Project.java package cn.itcast.many2many; import java.util.HashSet; import java.util.Set; public class Project { private int proj_id; @Override public String toString() { return "Project [proj_id=&qu

hibernate annotation映射关系详解

在hibernate中处理关系映射的方法有两种.一种是使用传统的xml来处理它们的映射关系,另一种是基于annotation的注解方式.我个人非常喜欢使用annotation,觉得这种方式显得更加的简洁,大大减少工作量.在hibernate4中annotation包无需再引入,因为已经集成了annotation包. 在讲hibernate annotation之前,我们先回想一下.在数据库创建表的时候有几个关键点是必须的.表名.字段名.字段类型.约束条件.从这些点出发我们来看看一个hiberna