hibernate 注释多表 级联操作
一对多模型(单向)
说明: 一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息。客户和地址是一对多的关系,并且客户与地址是单向关联的关系。 映射策略
# 外键关联:两个表的关系定义在一个表中;
# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联。 映射策略——外键关联 表结构如下:
TABLE customer(id int, name varcher, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, customer_id int, PRIMARY KEY id) 表address中的customer_id为customer表中的id的值,通过customer_id可以找到相应的customer的记录。
将表customer映射为CustomerEO实体,代码如下:
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id; @OneToMany(casade={CascadeTypeType.ALL})
@JoinColumn(name="customer_id")
public Collection<AddressEO> getAddress() {
return address;
}
....
} 一对多@OneToMany注解说明:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToMany {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default EAGER;
String mappedBy() default "";
}
# targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类;
因为一对多的实体集合时保存在集合类中,因此必须指明集合类中保存的具体类型:
1)指定集合泛型的具体类型;如:public Collection<AddressEO> getAddress() {...
2)指定targetEntity属性类型;如:@OneToMany(targetEntity=AddressEO.class,casade={CascadeTypeType.ALL})
# cascade属性表示与此实体一对一关联的实体的联级样式类型。联级样式上当对实体进行操作时的策略。
说明:在定义关系时经常会涉及是否定义Cascade(级联处理)属性,担心造成负面影响.
·不定义,则对关系表不会产生任何影响
·CascadeType.PERSIST (级联新建)
·CascadeType.REMOVE (级联删除)
·CascadeType.REFRESH (级联刷新)
·CascadeType.MERGE (级联更新)中选择一个或多个。
·还有一个选择是使用CascadeType.ALL ,表示选择全部四项
# fetch属性是该实体的加载方式,有两种:LAZY和EAGER。默认为惰性加载,一般也建议使用惰性加载。
# mappedBy属性用于双向关联实体时使用。 映射策略——表关联
在具体的设计中我们也会使用到使用另外单独的一张表来关联实体关系。比如customer和address例子中,我们增加一张ref_customer_address表保存以上两表的关系。
表结构如下:
TABLE customer(id int, name varcher, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)
TABLE ref_customer_address(customer_id int not null, address_id int not null unique)
将表customer映射为CustomerEO实体,代码如下:
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id; @OneToMany(casade={CascadeTypeType.ALL})
@JoinTable(name="ref_customer_address",
joinColumn={@JoinColumn(name="customer_id",referencedColumnName="id")},
inverseJoinColumn={@JoinColumn(name="address_id",referencedColumnName="id")}
)
public Collection<AddressEO> getAddress() {
return address;
}
....
} 表关联(@JoinTable)注解说明:
@Target({METHOD, FIELD})
public @interface JoinTable{
String name() default "";
String catalog() default "";
String schema() default "";
JoinColumn[] joinColumns() default {};
JoinColumn[] inverseJoinColumns() default {};
UniqueConstraint[] uniqueConstraints default {};
}
# name属性为连接两个表的表名称。若不指定,则使用默认的表名称,格式如下:
"表名1" + "_" + "表名2"
# joinColumn属性表示,在保存关系的表中,所保存关联关系的外键的字段,并配合@JoinColumn标记使用;
# inverseJoinColumn属性与joinColumn类似,它保存的是保存关系的另外一个外键字段;
# catalog和schema属性表示实体指定点目录名称或数据库名称;
# uniqueConstraints属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件,默认没有约束; 注意:@JoinTable不仅能够定义一对多的关联,也可以定义多对多表的关联。 默认关联
如果使用了表关联,并且该表又设置了外键,则在映射的实体关系时可以使用默认的映射关系设置,举例如下:
表结构如下:
TABLE customer(id int, name varcher, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)
TABLE ref_customer_address(customer_id int not null, address_id int not null unique)
创建customer_id外键
ALTER TABLE ref_customer_address ADD CONSTRAINT fk_ref_customer FOREIGN KEY (customer_id) REFERENCES customer (id);
创建address_id外键
ALTER TABLE ref_customer_address ADD CONSTRAINT fk_ref_address FOREIGN KEY (address_id) REFERENCES address(id); 映射实体CustomerEO的代码如下:
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id; @OneToMany
public Collection<AddressEO> getAddress() {
return address;
}
....
}
/*
* @ManyToOne指明OrderItem和Order之间为多对一关系,多个OrderItem实例关联的都是同一个Order对象。
* 其中的属性和@OneToMany基本一样,但@ManyToOne注释的fetch属性默认值是FetchType.EAGER。
*
* optional 属性是定义该关联类对是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。
* 值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。
* optional 属性的默认值是true。举个例:某项订单(Order)中没有订单项(OrderItem),如果optional 属性设置为false,
* 获取该项订单(Order)时,得到的结果为null,如果optional 属性设置为true,仍然可以获取该项订单,但订单中指向订单项的属性为null。
* 实际上在解释Order 与OrderItem的关系成SQL时,optional 属性指定了他们的联接关系optional=false联接关系为inner join,
* optional=true联接关系为left join。
*
* @JoinColumn:指明了被维护端(OrderItem)的外键字段为order_id,它和维护端的主键(orderid)连接,unique= true 指明order_id列的值不可重复。
*/
@ManyToOne(cascade = CascadeType.REFRESH, optional = false)
@JoinColumn(name = "order_id",referencedColumnName="orderid")
public Order getOrder() {
return order;
}
hibernate 注释多表 级联操作的更多相关文章
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- SSMybatis整合(二) -- 加入SpringMVC进行多表级联操作
---上节课我们讲了Mybatis的单表增删改查,关于代码我注释的比较详细,我相信初学的小伙伴还是多少能有一些收获的. - 第一集传送门:http://blog.csdn.net/jacxuan/ar ...
- 【EF学习笔记10】----------主从表级联操作
主从表 级联新增 Console.WriteLine("=========主从表 级联新增=========="); using (var db = new Entities()) ...
- Hibernate 一对多配置 级联操作(级联失败问题分析解决)
一方: package com.xdfstar.domain; import java.io.Serializable;import java.util.Date;import java.util.H ...
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制. 依旧用部门和员工举例.多个员工相应一个部门(多对一关联关系) 员工类:Employee.java package cn ...
- mysql数据库:分表、多表关联、外键约束、级联操作
一.分表.外键.级联.多对一 二.多对多 三.一对一 一.分表.外键.级联.多对一 将部门数据与员工数据放到同一张表中会造成 数据重复 结构混乱 扩展维护性差 需要分表 create table de ...
- Hibernate第三天——表间关系与级联操作
第三天,我们来使用Hibernate进行表之间一对多 多对多关系的操作: 这里我们先利用两个例子进行表关系的回顾: 一对多(重点): 例如分类和商品的关系,一个分类多个商品,一个商品属于一个分类 CR ...
- [原创]关于Hibernate中的级联操作以及懒加载
Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...
- Hibernate级联操作 注解
EJB3 支持的操作类型 /** * Cascade types (can override default EJB3 cascades */ public enum CascadeType { AL ...
随机推荐
- 安装MySql社区版(35-3)
1,https://dev.mysql.com/ --------------------------------------------------------------------------- ...
- 百度跨域搜索demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- springcloud系列12 config的使用
config组件分为server端和client端 config的原理: 就是当我们将配置文件放置在git上面,那么configserver就会去拉取相关配置文件至本地: 可以看到我本地是拉去了配置文 ...
- Carthage使用
# carthage 包管理 ## 安装过程 1) 安装homebrew ``` ruby$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githu ...
- 一个WordCount执行过程的实例
- ASP.NET中的DEC加密解密过程
本文章分享自 青青果树园的博客,地址是:http://www.cnblogs.com/qqingmu/archive/2008/01/10/1034168.html 我们做网页时经常会遇到URL传输( ...
- 【笔记篇】C#笔记2
返回目录:目录请戳这里~ C#数组 基本概念不提.. int[] a; bool[] b = new bool[10]; float[] c = {0.5, 57.0, 233.3, 12345.67 ...
- LUOGU P2949 [USACO09OPEN]工作调度Work Scheduling (贪心)
解题思路 明明一道比较简单的贪心结果挂了好几次23333,就是按照时间排序,然后拿一个小根堆维护放进去的,如果时间允许就入队并且记录答案.如果不允许就从堆里拿一个最小的比较. #include< ...
- 「BZOJ2300」[HAOI2011] 防线修建
传送门 操作离线之后倒着做,只有加点操作. 用set动态维护凸包即可. //Achen #include<algorithm> #include<iostream> #incl ...
- 03. 将pdb调试文件包含到.vsix包中
vs插件如何把pdb文件打包进去,方便记录日志和调试 <PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLoc ...