Hibernate基于注解的双向one-to-many映射关系的实现

在项目中用到了一对多的实体类关系映射,之前接触的都是基于配置文件的映射实现。可是公司的大部分都是基于注解的。因此自己參考之前的代码捣鼓了基于注解的一对多的映射关系实现。

背景:

一的一端:QingAoCenterInfo:青奥场所信息。

多的一端:QingAoPlaceInfo:青奥场馆信息,

当中一个青奥场所下能够包括多个青奥场馆

one端:QingAoCenterInfo,持有QingAoPlaceInfo的List引用,

通过注解@OneToMany(mappedBy="qingAoCenterInfo",cascade= CascadeType.ALL)

mappedBy:定义类之间的双向关系。假设类之间是单向关系,不须要提供定义,假设类和类之间形成双向关系,我们就须要使用这个属性进行定义, 否则可能引起数据一致性的问题。

要由One的一方指向Many的一方,而且,这个属性应该等于Many的一方中含有One类的属性的属性名,否则会出错啦

cascade:CascadeType[]类型。该属性定义类和类之间的级联关系。

定义的级联关系将被容器视为对当前类对象及其关联类对象採取同样的操作。并且这样的关系是递归调用的。

举个样例:Order 和OrderItem有级联关系,那么删除QingAoCenterInfo时将同一时候删除它所相应的QingAoPlaceInfo对象。

而假设QingAoPlaceInfo还和其它的对象之间有级联关系,那么这种操作会一直递归运行下去。

cascade的值仅仅能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。另一个选择是使用CascadeType.ALL,表示选择所有四项。

package com.yuqiaotech.nttelcom.model;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * 青奥重点场所信息表。
 *
 */
@Entity(name="QING_AO_CENTER_INFO")
@Table(name="QING_AO_CENTER_INFO")
public class QingAoCenterInfo {
	private Long id;
	private String centerName;	//重点场所名称
	private Long alarmNum;		//告警数
	private String note;		//备注
	private String iconName;	//图标名称
	private String cityName;	//所在城市
	private String type;		//重点场所、活动保障
	private Date createTime;
	private List<QingAoPlaceInfo> qingAoPlaceInfo; //场所拥有的场馆
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	/**
	 * @searchItem
	 * displayType="text"
	 *
	 * 重点场所名称
	 * @return
	 */
	public String getCenterName() {
		return centerName;
	}
	public void setCenterName(String centerName) {
		this.centerName = centerName;
	}
	/**
	 * 告警数
	 * @return
	 */
	public Long getAlarmNum() {
		return alarmNum;
	}
	public void setAlarmNum(Long alarmNum) {
		this.alarmNum = alarmNum;
	}
	/**
	 * 备注
	 * @return
	 */
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	/**
	 * 图标名称
	 * @return
	 */
	public String getIconName() {
		return iconName;
	}
	public void setIconName(String iconName) {
		this.iconName = iconName;
	}

	public String getCityName() {
		return cityName;
	}

	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	@OneToMany(mappedBy="qingAoCenterInfo",cascade= CascadeType.ALL)
	public List<QingAoPlaceInfo> getQingAoPlaceInfo() {
		return qingAoPlaceInfo;
	}
	public void setQingAoPlaceInfo(List<QingAoPlaceInfo> qingAoPlaceInfo) {
		this.qingAoPlaceInfo = qingAoPlaceInfo;
	}
}

many端:QingAoPlaceInfo。持有QingAoCenterInfo的引用

通过@ManyToOne(fetch=FetchType.LAZY )    @JoinColumn(name="f_center_id")设置关联关系

@ManyToOne指明QingAoPlaceInfo和QingAoCenterInfo之间为多对一关系,多个QingAoPlaceInfo实例关联的都是同一个QingAoCenterInfo对象

fetch和lazy是用来定义级联查询的方式:

fetch:官方文档里对fetch有例如以下描写叙述,Hibernate3 定义了例如以下几种抓取策略:

package com.yuqiaotech.nttelcom.model;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * 场馆信息。

*
 */
@Entity(name="QING_AO_PLACE_INFO")
@Table(name="QING_AO_PLACE_INFO")
public class QingAoPlaceInfo {
	private Long id;
	private QingAoCenterInfo qingAoCenterInfo;// 重点场所id
	private String placeName;// 场馆名称
	private String note;// 备注
	private String openStat;// 开通状态
	private Long displayOrder;
	private String cityName;
	private Date createTime;
	private List<QingAoPlaceCdmaSector> qingAoPlaceCdmaSector;//拥有的cdma
	private List<QingAoPlaceLteSector> qingAoPlaceLteSector;//拥有的Lte
	private List<QingAoAp> qingAoAp;							//拥有的Ap

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Long getId() {
		return id;
	}

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

	@ManyToOne(fetch=FetchType.LAZY )
	@JoinColumn(name="f_center_id")
	public QingAoCenterInfo getQingAoCenterInfo() {
		return qingAoCenterInfo;
	}

	public void setQingAoCenterInfo(QingAoCenterInfo qingAoCenterInfo) {
		this.qingAoCenterInfo = qingAoCenterInfo;
	}
	/**
	 * @searchItem
	 * displayType="text"
	 * 场所名称
	 * @return
	 */
	public String getPlaceName() {
		return placeName;
	}
	public void setPlaceName(String placeName) {
		this.placeName = placeName;
	}

	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}

	public String getOpenStat() {
		return openStat;
	}

	public void setOpenStat(String openStat) {
		this.openStat = openStat;
	}

	public Long getDisplayOrder() {
		return displayOrder;
	}

	public void setDisplayOrder(Long displayOrder) {
		this.displayOrder = displayOrder;
	}

	public String getCityName() {
		return cityName;
	}

	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	@OneToMany(mappedBy="qingAoPlaceInfo",cascade= CascadeType.ALL)
	public List<QingAoPlaceCdmaSector> getQingAoPlaceCdmaSector() {
		return qingAoPlaceCdmaSector;
	}

	public void setQingAoPlaceCdmaSector(
			List<QingAoPlaceCdmaSector> qingAoPlaceCdmaSector) {
		this.qingAoPlaceCdmaSector = qingAoPlaceCdmaSector;
	}
	@OneToMany(mappedBy="qingAoPlaceInfo",cascade= CascadeType.ALL)
	public List<QingAoPlaceLteSector> getQingAoPlaceLteSector() {
		return qingAoPlaceLteSector;
	}

	public void setQingAoPlaceLteSector(
			List<QingAoPlaceLteSector> qingAoPlaceLteSector) {
		this.qingAoPlaceLteSector = qingAoPlaceLteSector;
	}
	@OneToMany(mappedBy="qingAoPlaceInfo",cascade= CascadeType.ALL)
	public List<QingAoAp> getQingAoAp() {
		return qingAoAp;
	}

	public void setQingAoAp(List<QingAoAp> qingAoAp) {
		this.qingAoAp = qingAoAp;
	}
}
时间: 2024-08-18 14:10:09

Hibernate基于注解的双向one-to-many映射关系的实现的相关文章

Hibernate基于注解方式的各种映射全面总结

1. 使用Hibernate Annotation来做对象关系映射 1) 添加必须包: hibernate-jpa-2.0-api-1.0.0.Final.jar 2) 在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上. a) @Entity 映射一个实体类 @Table 指定关联的表 b) @Id 映射OID c) @GeneratedValue 指定OID的生成策略 d) @Version 映射版本号属性 e) @Column 指定

hibernate基于注解的维护权反转:@OneToMany(mappedBy=)

背景说明:首先是SSH环境下,对象基于注解的方式映射到数据库: 昨天遇到一个比较纠结的问题,@OneToMany(mappedBy="xxx"), mappedBy属性有什么用,然后是写在哪一边? 还有一个问题是:@JoinColumn(name="xxxxx"),JoinColumn有什么用? 先贴出最初的代码:一些基本的注解,在一对多的关系上没有使用JoinColumn和mappedBy属性 部门类:主要是第33.34行 1 package com.lizhou

Hibernate 基于注解的SessionFactory类的生成以及自动生成表SchemaExport类的

像之前基于映射文件 .hbm.xml 的SessionFactory类的写法是这样的 <span style="font-size:18px;color:#33CC00;">private static SessionFactory sessionFactory ; static { sessionFactory = new Configuration().configure().buildSessionFactory(); }</span> 自动生成数据库Sc

hibernate通过注解实现实体和表的映射

参考: 表名的映射: //代表此类参与ORM映射,此注解必须要有 @Entity //代表user这个类映射了一个表user50,如果表名和类名一样,此注解可以省略 @Table(name="user50") public class User { 主键的映射: //主键,此注解必须要有 @Id //数据库表中主键列名为id,如果实体类属性名和列名相同,此注解可以省略 @Column(name="id") //主键的维护策略 @GenericGenerator(na

Hibernate中的一对一映射关系

Hibernate中的一对一映射关系有两种实现方法(一对一关系:例如一个department只能有一个manager) I使用外键的方式 步骤:1在一对一关联的持久化类中互相添加对方对象属性,   例如在department中添加private manager manager属性:   department代码如下: package com.atguigu.hibernate.one2one.foreign; public class Department { private Integer d

Hibernate关联映射关系

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

Hibernate映射关系:一对一、一对多和多对多

在 Hibernate 中,同样可以对多张存在关联关系的表进行操作,但需要在映射文件中,将对象的关联关系与数据库表的外键关联进行映射.本章将对 Hibernate 的关联关系映射进行详细讲解. 在关系型数据库中,多表之间存在着三种关联关系,分别为一对一.一对多和多对多,如图 1 所示 图 1  关系型数据库中多表之间的三种关联关系 这三种关联关系的具体说明如下. 一对一:在任意一方引入对方主键作为外键. 一对多:在“多”的一方,添加“一”的一方的主键作为外键. 多对多:产生中间关系表,引入两张表

基于注解的struts2+spring+hibernate集成

applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.spri

基于注解的Spring MVC整合Hibernate

1.导入jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&