Hibernate多对一装备

hibernate中的多对一装备有两种状况:
一种是子表的外键对应主表的主键id。
另一种是子表的外键对应主表的非主键字段,通常是一个仅有的字段。(常见的场景是订单主表跟订单产品明细表,主表跟子表都是用id作为主键,可是两者之间通过orderNo(订单号)来相关)

下面依据这两种状况,简略介绍一下号码大全hibernate映射文件的装备。
第一种状况,假设主表是部分表(department),关键词挖掘工具表是职工表(employee)。
domain类如下:
Java代码 保藏代码

国医一号 http://www.tdhzp.com

临沂批发网 http://www.shoudashou.com
package com.xigua.domain;

public class Department {

/**
* 主键id
*/
private Long id;

/**
* 部分称号
*/
private String departName;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getDepartName() {
return departName;
}

public void setDepartName(String departName) {
this.departName = departName;
}

}

Java代码 保藏代码
package com.xigua.domain;

/**
* 职工
* @author Administrator
*
*/
public class Employee {

/**
* 主键id
*/
private Long id;

/**
* 职工称号
*/
private String empName;

/**
* 部分目标
*/
private Department department;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getEmpName() {
return empName;
}

public void setEmpName(String empName) {
this.empName = empName;
}

public Department getDepartment() {
return department;
}

public void setDepartment(Department department) {
this.department = department;
}
}

对应的hibernate映射文件如下:
Xml代码 保藏代码

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">

Xml代码 保藏代码

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"D:\tools\hibernate\dtd\hibernate-mapping-3.0.dtd">

通过上述的装备以后,就将Employee跟Department进行了多对一绑定了。
可敲下面的代码验证:
Java代码 保藏代码
package com.xigua.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.xigua.domain.Department;
import com.xigua.domain.Employee;
import com.xigua.utils.HibernateUtil;

public class Test1 {

public static void main(String args[]) {

save();
query();
}

public static void save() {
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();

Department depart = new Department();
depart.setDepartName("dev");

Employee emp1 = new Employee();
emp1.setEmpName("xigua1");

// 级联保留职工的部分
emp1.setDepartment(depart);

session.save(depart);
session.save(emp1);

tx.commit();
}catch(Exception e) {
if(tx != null) {
tx.rollback();
}
throw e;
}finally {
if(session != null) {
session.close();
}
}
}

public static void query() {
Session session = null;
try{
session = HibernateUtil.getSession();

Employee emp = (Employee) session.get(Employee.class, 1L);
System.out.println(emp.getEmpName());

// 级联检查职工对应的部分
Department depart = emp.getDepartment();
System.out.println(depart.getDepartName());
}catch(Exception e) {
throw e;
}finally {
if(session != null) {
session.close();
}
}
}

}

假如想在Department目标中也绑定一对多联系,则需求修改Department.java类跟对应的hibernate映射文件。
Department.java类中增加一个Set调集目标,对应的hibernate文件中也装备一个标签,详细见下面的代码。
增加Set调集目标后的Department.java类:
Java代码 保藏代码
package com.xigua.domain;

import java.util.Set;

public class Department {

/**
* 主键id
*/
private Long id;

/**
* 部分称号
*/
private String departName;

/**
* set调集 存在该部分下的职工信息
*/
public Setemps;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getDepartName() {
return departName;
}

public void setDepartName(String departName) {
this.departName = departName;
}

public SetgetEmps() {
return emps;
}

public void setEmps(Setemps) {
this.emps = emps;
}

}

时间: 2024-12-18 12:53:37

Hibernate多对一装备的相关文章

hibernate多对多中间表设计

hibernate多对多中间表,一般都是两个外键,例如 用户表(user),主键:userid. 角色表(role),主键:roleid. 中间表字段为两个外键:userid,roleid作为联合主键. 但是如果想在中间表加一个字段作为单独的主键,即设置一个字段id作为主键.并且数据库采用的是oracle数据库,主键不能自增.那么采用hibernate向中间表插数据的时候,就会出现问题,即主键id字段插入为空,会报错误. 由于oracle不支持自动编号,为解决以上错误,我们还得为oracle数据

Hibernate多对多级联操作

表与表之间关系回顾(重点) 2 多对多 (1)订单和商品关系,一个订单里面有多个商品,一个商品属于多个订单 (2)用户和角色多对多关系 - 用户: 小王.小马.小宋 - 角色:总经理.秘书.司机.保安 ** 比如小王 可以 是总经理,可以是司机 ** 比如小宋 可以是司机,可以是秘书,可以保安 ** 比如小马 可以是 秘书,可以是总经理 -          一个用户里面可以有多个角色,一个角色里面可以有多个用户 (3)多对多建表:创建第三张表维护关系 Hibernate多对多操作 多对多映射配

SSH学习 Hibernate 多对多

Hibernate 多对多关系的处理,是把两个po类(持久化类)分别建表,这两个是要自己写po类和对应的映射文件,两个表的关系另外再建一张表,这个关系表不需要有对应的类,只需在映射文件写必要的标签即可 注明一点:fetch = "join" fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询: 而join方式,主体对象和关联

Hibernate多对多关系映射(建表)

下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了Hibernate多对多关系映射,则中间关系表不会生成实体(即没有对应的pojo类,更没有其映射文件). 1.建立表 DROP TABLE user_course ; DROP TABLE user ; DROP TABLE course ; CREATE TABLE user ( userid  

hibernate 多对多一个对象出现多条记录问题

hibernate 多对多时,当需要根据它关联的对象查找的时候,会出现一个对象有多条记录的问题 用 left join fetch 抓取查询的时候还是会出现这问题,是因为主表在关联表中有多条记录 用 select distinct d from Demand d inner join d.skillS s where d.timekey > -1 关键字 distinct 可以来保证一个对象只有一条记录 hibernate 多对多一个对象出现多条记录问题

【SSH高速进阶】——Hibernate 多对多映射

说到多对多关系.印象最深刻的就是大学的选修课.一个学生能够选修多门课程,一门课程能够有多个学生选修,学生所选的每一门课程还有成绩. 这个场景的E-R图例如以下: 对于多对多的关系,我们一般会抽出一张中间表(连接表),来负责维护这两张表的多对多关系.比方上述关系应该生成的表结构为: PO对象 Student.java public class Student { private int id; private String name; private Set<Course> courses; /

hibernate多对一关联映射

hibernate多对一关联映射: 实体类 (POJO) public class Student{ private int stuId; private String stuNum; private String stuName; private ClassRoom cr; } public class ClassRoom{ private int claId; private String claName; } 映射文件 <class name=" Student" tabl

Hibernate多对多删除问题的解决

原出处:http://superleo.iteye.com/blog/154587 Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关系建立 老师Teacher 与 课程Course 是一个多对多的关系,Pojo与XMl配置如下. Pojo Java代码 收藏代码 /** * Course Entity * see table: tbl_course */ package com.leo.domain;

Hibernate多对多两种情况

Hibernate在做多对多映射的时候,除了原先的两张表外,会多出一个中间表做关联,根据中间表的会有两种不同的配置情况: 1.中间表不需要加入额外数据. 2.中间表有其他字段,需记录额外数据. 下面,我们就以address.person这两张表根据这两种情况做下相应的配置: 情况1: 我们需要建三张表,一张address表,一张person表,一张中间表(其实中间表可以不用建,配置好后运行会自动生成),如下: delimiter $$ CREATE TABLE `address` ( `addr