在hibernate的关联操作中有很多关系,其中多对一关系是最常见的。我们看这两个表。

这里有部门表和员工表。

那么我们可以这么说一个部门可以有多个员工。这就是1对多的关系。这是我们站在部门表的角度上看的。

那么我们也可以说多个员工是一个部门的,这就是多对一的关系。这就是我们站在员工表的角度上说的。

下面我做一个多对一的例子,实现两表的增加和查询操作。

1.      部门对象映射类

package com.fish.testdao;

public class Department {

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;

}

}

2.      员工对象映射对象类

package com.fish.testdao;

public class Employee {

private Integer id;//员工编号

private String name;//员工姓名

private Department department;//部门类(有这个我们就可以找到部门表的信息)

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 getDepartment() {

return department;

}

public void setDepartment(Department department) {

this.department = department;

}

}

接着我们写一个部门的映射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>

<class name="com.fish.testdao.Department" >

<id name="id" type="integer">

<generator class="increment"></generator>

</id>

<property name="name"></property>

</class>

</hibernate-mapping>

然后一写一个员工的映射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>

<class name="com.fish.testdao.Employee" >

<id name="id" column="id"type="integer">

<generator class="increment"></generator>

</id>

<property name="name" ></property>

<many-to-one name="department"    ></many-to-one>

</class>

</hibernate-mapping>

*注<many-to-onename="department"   ></many-to-one>这句话就说明了我们是站在员工表的角度操作部门表的。首先name是前面映射类的属性,后面如果不加property-ref="部门表中的字段"  则说明该表默认找部门的表主键为员工表的外键。这样我们可以在数据库生成的表,department就是在员工表的外键,且字段名是department

所以我一直的理解就是多对一就是通过外键来实现的。

然后我们写一个配置文件

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD3.0//EN"

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

<hibernate-configuration>

<session-factory>

<property name="connection.driver_class">

com.mysql.jdbc.Driver

</property>

<property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>

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

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

<property name="dialect">org.hibernate.dialect.HSQLDialect</property>

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

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

<mapping  resource="com/fish/testdao/Employee.hbm.xml"/>

<mapping  resource="com/fish/testdao/Department.hbm.xml"/>

</session-factory>

</hibernate-configuration>

我们写一个测试类

package com.fish.domain;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.fish.testdao.Department;

import com.fish.testdao.Employee;

public class Test {

//写一个得到session的模板

public staticSession getMySession() {

Configurationconfiguration = new Configuration();

configuration.configure("hibernate.cfg.xml");

SessionFactoryfactory = configuration.buildSessionFactory();

Sessionsession = factory.openSession();

returnsession;

}

//对两个表数据的添加

public staticvoid add() {

Sessionsession = getMySession();

Departmentdepartment = new Department();

department.setName("财务部");

Employeeemployee = new Employee();

employee.setName("yaku");

employee.setDepartment(department);

Transactiontransaction = session.beginTransaction();

transaction.begin();

session.save(department);

session.save(employee);

transaction.commit();

session.close();

}

//通过查员工表知道他是隶属那个部门的

public staticvoid query() {

String hql ="from Employee";

Sessionsession = getMySession();

Query query =session.createQuery(hql);

List<Employee>list = query.list();

for (Employeei : list) {

System.out.println(i.getName()+"归属"+i.getDepartment().getName());

//结果是:    yaku归属财务部

}

}

public staticvoid main(String[] args) throws Exception {

add();

query();

}

}

hibernate多对一的操作解析的更多相关文章

  1. java框架之Hibernate(3)-一对多和多对多关系操作

    一对多 例:一个班级可以有多个学生,而一个学生只能属于一个班级. 模型 package com.zze.bean; import java.util.HashSet; import java.util ...

  2. Hibernate多对多操作

    ---------------------siwuxie095 Hibernate 多对多操作 以用户和角色为例 (一)多对多映射配置 第一步:创建两个实体类,用户和角色 第二步:让两个实体类之间互相 ...

  3. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  4. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  5. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  6. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  7. hibernate 多对多

    HibernateHibernate多对多关联映射通常别拆分成两个多对一关联映射1. 下面的HostBean.UserBean.UserHostBean,UserHostBean是两个表之间的关联表, ...

  8. Hibernate多对一ManytoOne

    ------------------------Hibernate多对一ManytoOne 要点: ManytoOne配置在多端 可以配置级联操作 @ManyToOne(cascade=Cascade ...

  9. Hibernate 多对一关联查询

     版权声明:本文为博主原创文章,如需转载请标注转载地址.  博客地址:http://www.cnblogs.com/caoyc/p/5598269.html  一.单向多对一和双向多对一的区别 如果只 ...

随机推荐

  1. LinqToXML~读XML文件

    linq的出现,带给我们的是简结,快速,可读性,它由linq to sql,linq to object,linq to XML组成,我的博客之前有对linq to sql的讲解,而今天,我将讲一个l ...

  2. [POJ 3734] Blocks (矩阵高速幂、组合数学)

    Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3997   Accepted: 1775 Descriptio ...

  3. 观察者模式与Boost.Signals

      1)  观察者模式定义 略,各种设计模式的书上都有定义. 2)  观察者模式一般实现 观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”.代码,其中使用了b ...

  4. Android 使用图标字体库

    首先,在assets资源文件下放入图标字体库. 我这儿采用的是fontawesome-webfont.ttf 然后, 在安卓中加载这个资源文件 Typeface fontFace = Typeface ...

  5. Java学习——接口Interface

    接口: 初期理解可以认为是一个特殊的抽象类 当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示.class用于定义类interface 用于定义接口 接口定义时,格式特点:1,接口中常量见定 ...

  6. iOS-设计模式之代理反向传值

    代理设计模式就是自己的方法自己不实现,让代理对象去实现. 可以让多个类实现一组方法. 委托模式的好处在于: 1.避免子类化带来的过多的子类以及子类与父类的耦合 2.通过委托传递消息机制实现分层解耦 代 ...

  7. C#控制条码打印机 纸张大小,间距,绘制内容(所有条码打印机通用)

    其他条码知识 请访问:http://www.ybtiaoma.com ,本文仅供参考,请勿转载,谢谢 using System; using System.Drawing; using System. ...

  8. 使用BOOST.SPIRIT.X3的RULE和ACTION进行复杂的语法制导过程

    Preface 上一篇简述了boost.spirit.x3的基本使用方法.在四个简单的示例中,展示了如何使用x3组织构造一个语法产生式,与源码串匹配并生成一个综合属性.这些简单的示例中通过组合x3库中 ...

  9. pp to write

    vanishing gradient problem multi-dimensional lstm

  10. JSON的parse()方法

    JSON方法也可以接受另外的一个参数,作为还原函数. 实例: var book = { title:"JavaScript Learn", author:["wang&q ...