Hibernate注解开发教程
源代码: https://github.com/weiliangchun/JavaCode/tree/master/hibernateImooc/2-4Hibernate-annotation
第一章 类级别注解
1-1 本章简介
一、Hibernate注解简介
使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm.xml)的配置
二、JPA与Hibernate的关系
1. 什么是JPA
全称Java Persistence API。JPA注解是javaEE的规范和标准
2. 关系
JPA是标准接口,Hibernate是实现,但是其功能是JPA的超集
3. Hibernate如何实现与JPA的关系
通过hibernate-annotation、hibernate-entitymanager和hibernate-core三个组件来实现
4. 一般在实际开发中,优先考虑使用JPA注解,这样更有利于程序的移植和扩展
三、Hibernate注解的分类
- 类级别注解
- @Entity
- @Table
- Embeddable
- 属性级别注解
- 映射关系注解
1-2 准备工作
hibernate.cfg.xml
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=utf8</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
1-3 @Entity注解
- @Entity: 映射实体类
- @Entity(name="tableName") name可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略
注意:使用@Entity时必须指定实体类的主键属性
@Id
public int getSid() {
return sid;
}
@Test
public void testSchemaExport() {
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();
SchemaExport schemaExport = new SchemaExport();
schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);
}
1-4 @Table注解
- @Table(name="",catalog="",schema="")
- 和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息
- name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名
- catalog:可选,表示Catalog名称,默认为Catalog("")。
- schema:可选,表示Schema名称,默认为Schema("")。
Schema与Catalog
- 从实现角度来看,各种数据库系统对Catalog和Schema的支持和实现方式千差万别的
1-5 @Embeddable
- @Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在
/*
* 地址类
*/
@Embeddable //表示是一个嵌入类,这个类的对象在另一个实体类中充当属性
public class Address {
private String postCode;// 邮编
private String address;// 地址
private String phone;// 电话
...
}
/*
* 学生实体类
*/
@Entity
@Table(name = "t_students", schema = "hibernate")
public class Students {
...
private Address add;
...
}
第二章 属性级别注解
2-1 内容简介
添加方式:
- 写在字段上面
- 写在属性的get访问器的上面
***
- @Id
- @SequenceGenerator
- @GeneratedValue
- @Column
- @Embedded
- @EmbeddedId
- @Lob
- @Version
- @Basic
- @Transient
2-2 @Id
- @Id:必须,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,可置于主键属性或者getXxx()前。
- 注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口
2-3 @GeneratedValue
@GeneratedValue(strategy=GenerationType)
- strategy表示主键生成策略,取值有:
- GenerationType.AUTO:主键由程序控制(也是默认的,在指定主键时,如果不指定主键生成策略,默认为AUTO)
- GenerationType.IDENTITY:主键由数据库自动生成(主要是自动增长型)
- GenerationType.SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- GenerationType.TABLE:使用一个特定的数据库表格来保存主键。
如:
@Id
@TableGenerator(name="tab_cat_gen",allocationSize=1)
@GeneratedValue(Strategy=GenerationType.Table)
Generator - 表示主键生成器的名称,这个属性通常和ORM框架相关,例如:Hibernate可以指定uuid等主键生成方式
2-4 @Column
- @Column - 可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用
常用属性:
- name:可选,表示数据库表中该字段的名称,默认情形属性名称一致
- nullable:可选,表示该字段是否允许为null,默认为true
- unique:可选,表示该字段是否是唯一标识,默认为false
- length:可选,表示该字段的大小,仅对String类型的字段有效,默认值255(如果是主键不能使用默认值)
- insertable:可选,表示在ORM框架执行插入操作时,该字段是否应出现INSERT语句中,默认为true
- updateable:可选,表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段
2-5 @Embedded
- @Embedded是注释属性的,表示该属性的类是嵌入类
- 注意:同时嵌入类也必须标注@Embeddable注解
2-6 @EmbeddedId
- @EmbeddedId使用嵌入式主键类实现复合主键
- 注意:嵌入式主键类必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals和hashCode方法
2-7 @Transient
- 可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将标识为@Transient,否则ORM框架默认其注解为@Basic
第三章 关系映射级别注解
3-1 内容简介
- 一对一单向外键
- 一对一双向外键关联
- 一对一单向外键联合主键
- 多对一单向外键关联
- 一对多单向外键关联
- 一对多双向外键关联
- 多对多单向外键关联
- 多对多双向外键关联
3-2 实体之间的映射关系
- 一对一:一个公民对应一个身份证号码
- 一对多(多对一):一个公民有多个银行账号
- 多对多:一个学生有多个老师,一个老师有多个学生
3-3 一对一单向外键关联
- @OneToOne(cascade=CascadeType.ALL)
- @JoinColumn(name="pid",unique=true)
- 注意:保存时应该先保存外键对象,再保存主表对象
3-4 一对一双向外键关联
- 主控方的配置同一对一单向外键关联
- @OneToOne(mappedBy="card") //被控方
- *双相关联,必须设置mappedBy属性,因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双防都无法保存**
3-5 一对一双向外键联合主键
- 创建主键类
- 主键类必须实现Serializable接口,重写hashCode()和equals()方法
//主键类
@Embeddable
//实体类
@EmbeddedId
3-6 多对一单向外键
- 多方持有一方的引用,比如:多个学生对应一个班级(多对一)
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name="pid",referencedColumnName="CID")
3-7 多对多单向外键
- 学生和教室构成多对多的关联关系
- 其中一个多方持有另一个多方的集合对象(学生持有教室的集合)
- 创建中间表
//学生类
@ManyToMany
@JoinTable(name="teachers_students",joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
第四章 课程总结
- 类级别注解 @Entity @Table @Embeddable
- 属性级别注解 @Id @GeneratedValue @Column @Embedded @Embeddable @Transient
- 映射关系注解
- 一对一单向外键 @OneToOne
- 一对一双向外键关联 @OneToOne(mappedBy="xxx")
- 一对一单向外键联合主键 @Embeddable @EmbeddedId
- 多对一单向外键关联 @ManyToOne @JoinColumn
- 一对多单向外键关联 @OneToMany @JoinColumn
- 一对多双向外键关联 @ManyToOne @OneToMany @JoinColumn
- 多对多单向外键关联 @ManyToMany @JoinTable
- 多对多双向外键关联 @ManyToMany(mappedBy="xxx") @JoinTable
Java初级开发技术交流群:619201650。欢迎加入进行技术交流,禁止闲聊、斗图。
Hibernate注解开发教程的更多相关文章
- (转) Hibernate注解开发
http://blog.csdn.net/yerenyuan_pku/article/details/70162268 Hibernate注解开发 在Hibernate中我们一般都会使用注解,这样可以 ...
- Hibernate注解开发详解
*****************关于注解的简单介绍 详细介绍请点击这里注解详细教程 package com.tomowork.pojo; import org.hibernate.annotatio ...
- Hibernate注解开发、注解创建索引
1.注解的目的 简化繁琐的ORM映射文件(*.hbm)的配置 2.JPA和hibernate的关系 JPA:java persistence API,JPA注解是JavaEE的标准和规范. 两者的关系 ...
- Hibernate注解开发示例
-------------------------------------------------------------------customer------------------------- ...
- SpringBoot使用Mybatis注解开发教程-分页-动态sql
代码示例可以参考个人GitHub项目kingboy-springboot-data 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframe ...
- springboot(二十一):SpringBoot使用Mybatis注解开发教程-分页-动态sql
https://blog.csdn.net/KingBoyWorld/article/details/78948304
- Hibernate的应用与注解开发
Hibernate注解可以帮助我们大大简化hbm映射文件的配置,学习记录之. 先看示例: 1 package com.webShop.domain; 2 import java.io.Serializ ...
- Struts2、Spring、Hibernate 高效开发的最佳实践(转载)
Struts2.Spring.Hibernate 高效开发的最佳实践 Struts2.Spring.Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 ...
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
随机推荐
- 自定义Git(转载)
转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137621280731 ...
- GoLang 编译exe添加ICO图标
我们在做Go开发的时候在Window平台下编译出来的exe后大部分都是没有图标,看起来很难看.下面我们说下如何添加一个图标. 1.首先在根目录下,exe的同级目录下创建.rc文件, IDI_ICON1 ...
- Java 中数组的遍历方式
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 今天我们就来说一下在java中遍历数组都有哪几 ...
- 安卓5.0新特性之Palette
根据图片来决定标题的颜色和标题栏的背景色,这样视觉上更具有冲击力和新鲜感,而不像统一色调那样呆板. Palette这个类能提取以下突出的颜色: Vibrant(充满活力的) Vibrant dark( ...
- windows怎么进如debug调试
主要说一下64位Win7使用debug程序的方法 首先你要下载一个DOSBOX程序 这个程序是一个dos模拟器 这个程序的制作目的是运行经典的DOS游戏 -.- 下载地址:http://www.dos ...
- HDU 3007 最小圆覆盖 计算几何
思路: 随机增量法 (好吧这数据范围并不用) //By SiriusRen #include <cmath> #include <cstdio> #include <al ...
- 344 Reverse String 反转字符串
请编写一个函数,其功能是将输入的字符串反转过来.示例:输入:s = "hello"返回:"olleh"详见:https://leetcode.com/probl ...
- cocos2d-x 不规则碰撞检测 【转载】
原文:http://www.2cto.com/kf/201401/272331.html //判断有没有点到有材质的部分, p_point相对, CCSprite坐标 (p_point是相对 Spr ...
- C# 多线程系列(五)
死锁 为了线程安全,我们在需要的是会使用”独占锁“,但过多的锁定也会有麻烦.多个线程因为竞争资源相互等待而造成的僵局,我们称为死锁.若无外力作用,这些进程将都无法推进.在死锁中,至少有两个线程被挂起, ...
- Java—RequestMapping相关用法
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.它有6个属性:1.value:指定请求的具体地址:valu ...