Hibernage.cfg.xml:

<hibernate-configuration>
<session-factory name="sessionFactory">
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/hbm/Person.hbm.xml" />
<mapping resource="cn/hbm/Department.hbm.xml" />
</session-factory>
</hibernate-configuration>

Person:

public class Person {
private Integer id;
private String name; 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;
}
}

hbm.xml:

<hibernate-mapping package="cn.model">
<class name="Person" table="PERSON">
<id name="id" column="ID">
<generator class="native"></generator>
</id>
<property name="name" column="NAME" type="java.lang.String" />
</class>
</hibernate-mapping>

Department:

public class Department {

	private Integer id;
private String name;
private Set<Person> persons; 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<Person> getPersons() {
return persons;
}
public void setPersons(Set<Person> persons) {
this.persons = persons;
} }

hbm.xml:

<hibernate-mapping package="cn.model">
<class name="Department" table="DEPARTMENT">
<id name="id" column="ID">
<generator class="native"></generator>
</id>
<property name="name" column="NAME" type="java.lang.String" />
<set name="persons">
<key column="DEPT_ID" />
<one-to-many class="Person" />
</set>
</class>
</hibernate-mapping>

在Department实体中有一个Set<> 集合用来存储该部门下的所有员工,在hbm.xml 可以使用Set实现映射关系,one-to-many中需要指定Set中存储的对象来自哪个实体;并且通过Key中的列名来进行关连映射操作。

添加数据:

public void save(){
Session session=null;
Transaction tran=null;
try{
Department dept=new Department();
dept.setName("IT开发部"); Person person1=new Person();
person1.setName("汤姆克路斯");
person1.setDept(dept); Person person2=new Person();
person2.setName("大为史密斯");
person2.setDept(dept); // 或者(结果一样,但是Hibenate的处理流程完全不一样)
//Person person1=new Person();
//person1.setDept(dept);
//Person person2=new Person();
//person2.setName("大为史密斯");
//Set<Person> sets=new HashSet();
//sets.add(person1);
//sets.add(person2);
//Department dept=new Department();
//dept.setName("IT开发部");
//dept.setPersons(sets); session=HibernateSessionFactory.getSession();
tran=session.beginTransaction();
session.save(dept);
session.save(person1);
session.save(person2);
tran.commit();
}catch(Exception e){
if(session!=null){
session.close();
}
}
}

获取部门:

public Department getDepartmentById(Serializable id){
Session session=null;
try{
session=HibernateSessionFactory.getSession();
Department dept=(Department)session.get(Department.class, id);
//关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) ) 等
//在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Object proxy) 方法强制加载这样就相当于动态改变为lazy=false。
Hibernate.initialize(dept.getPersons());
return dept;
}catch(Exception e){
if(session!=null){
session.close();
}
}
return null;
}

测试:

@Test
public void testDeptList(){
Demo demo=new Demo();
Department dept=demo.getDepartmentById(1);
System.out.println("部门:"+dept.getName());
System.out.println("员工有:");
for(Person per : dept.getPersons()){
System.out.println(per.getName());
}
}

结果 :

Hibernate 多表关联映射- 一对多关系映射(one-to-many)的更多相关文章

  1. 菜鸟学习Hibernate——一对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...

  2. hibernate实体xml一对多关系映射

    单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; p ...

  3. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  4. ORM映射(对象关系映射)

    ORM映射(对象关系映射)分创建表和操作表两个部分创建单表创建关联表(foreignKey) 一对一 一对多(重点) 多对多(重点) 创建表后加str方法把打印的地址转换成对应字符表的操作(增删改查) ...

  5. 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射

    实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  6. 0050 MyBatis关联映射--一对多关系

    一对多关系更加常见,比如用户和订单,一个用户可以有多个订单 DROP TABLE IF EXISTS customer; /*用户表*/ CREATE TABLE customer( `pk` INT ...

  7. hibernate课程 初探单表映射1-9 创建关系映射文件

    创建关系映射文件:(把实体类映射成一个表) 1 右键src==>new==>other==>hibernate==>hbm.xml==>Student==>Fini ...

  8. Hibernate制图(两)——许多-于─关系映射

    上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...

  9. Hibernate各种基本注解及一对一(多)关系映射采坑笔记

    hibernate提供两种方式配置关系映射,一种XMl配置,一种注解.SpringBoot已经自带了hibernate注解方式,我也是特别喜欢使用注解,特此记下常用的知识点. 1.基本注解 @Tabl ...

随机推荐

  1. SQL Server 解决CPU 高占用的一般step

    第一步: 看这些CPU是不是SQL Server用的. 第二步: 确定SQL Server 有没有引发17883\17884错误 第三步: 找出使用CPU最高的语句进行优化.(sys.dm_exec_ ...

  2. 复习完毕STM32开发板

        经过半个晚上的折腾,终于复习了STM32开发板,并使用ST官方库调试完毕一个printf重定向到串口的程序,3.5的库同以前的库不大一样,不过最终搞好了可以睡觉了,还可以睡7个小时.     ...

  3. 几个常用道的macro

    几个常用道的macro1.macro(1)#error msg 指令使編譯器停止執行並打印一條語句,(2)printf("%d,%s",_LINE_,_FILE_)打印當前行號和文 ...

  4. js 中的switch

    前言 switch 这种表达式在很多语言中都有,比如java, C等待, 使用switch比使用if else 来得方便,来得清晰. 使用语法很简单: switch(n) { case 1: 执行代码 ...

  5. Educational Codeforces Round 9

    Educational Codeforces Round 9 Longest Subsequence 题目描述:给出一个序列,从中抽出若干个数,使它们的公倍数小于等于\(m\),问最多能抽出多少个数, ...

  6. asp.net调用非托管dll,无法加载 DLL,找不到指定模块解决方法。

    最近开发一个项目,里面用到了非.net开发的一个dll文件接口,发现发布到window2003服务器上后,运行网站总是提示 "无法加载 DLL"D:\11\1.dll": ...

  7. 命名空间“Aspose”中不存在类型或命名空间名称“Slides”。

    有可能引用的dll与项目的 .netFramework版本不同,需要确认两个版本是否相同.如果不同,项目右键->属性->应用程序.选择和引用的dll相同的版本.

  8. iOS 原生地图 开发

    iOS开发有时候用到地图,不少人第一想到的是用第三方.当然有时候为了和安卓同步,可能会一起使用某一第三方.但有时候,我们是可以用原生地图开发的.上面两个示意图是原生地图的自定义开发.运行demo,将展 ...

  9. HttpWebResponse请求状态代码

    HttpWebResponse请求状态代码标识 成员名称 说明 Continue 等效于 HTTP 状态 100.Continue指示客户端可能继续其请求. SwitchingProtocols 等效 ...

  10. 【Trie】【HDU1247】【Hat’s Wordsfd2】

    题目大意: hat's word 的定义是字典中 恰好由另外两个单词连接起来的单词 给你一本字典,问有多少个hat's word,(字典按字典序给出) 单词数50000.. 初步思路: 单词分为前缀单 ...