[TOC]
Hibernate
pom依赖
junit
junit
4.12
test
antlr
antlr
2.7.7
com.fasterxml
classmate
1.3.4
dom4j
dom4j
1.6.1
org.apache.geronimo.specs
geronimo-annotation_1.0_spec
1.0
org.hibernate.common
hibernate-commons-annotations
5.0.1.Final
org.hibernate
hibernate-core
5.0.12.Final
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
1.0.0.Final
org.jboss
jandex
2.0.0.Final
jboss
javassist
3.7.ga
org.jboss.logging
jboss-logging
3.3.1.Final
mysql
mysql-connector-java
5.1.30
- 配置文件
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate
root
org.hibernate.dialect.MySQL5InnoDBDialect
true
true
update
注意:主配置文件名,一般默认是hibernate.cfg.xml,并且在src根目录中
上面的配置文件,可以参考etc文件夹下的配置文件
- 创建类
public class User {
private int uid;
private String username;
private String password;
//get/set方法 必须要有
}
- 映射文件
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory factory = configure.buildSessionFactory();
Session session = factory.openSession();// 获取连接
// 开启事务
Transaction tx = session.beginTransaction();
User user = new User("黄蓉", "123");
session.save(user);
tx.commit();// 提交事务
session.close();// 关闭连接
session查用api
save、delete、update、get
load
延迟查询:如果使用了对象中非id的属性时才会发送sql语句
saveOrUpdate
瞬时态执行save(),游离态执行update()
merge
两个相同id的对象合并
实体类的三种状态
瞬时态:无id,与session无关联,与数据库无关联
持久态:有id,与session有关联,与数据库关联
持久态对象修改数据,会自动修改数据库的数据
游离态(离线):有id,与session无关联,与数据库无关
游离态的对象如果id与表中的记录id一致,那么save时将发送update语句
具体请看hibernate的三种状态
关联关系
多对一
多个Customer对应一个User
一对多
一个User对应多个Customer
注意:一对多,多对一其实是从不同角度看问题,本质是一样的,任意写一个就是单向的一对多(多对一),两个都写,就是双向的一对多(多对一)。单向意味着,只能从一方找到另一方,双方可以相互找到对方。
多对多
hibernate常用查询api
详情请点击这里
hibernate缓存
一级缓存:
第一次查找,去缓存中找,没有数据,从数据库获取,然后存入一级缓存,并且存入快照区;session没有关闭,并且执行第二次查找,先从一级缓存中获取。如果对象修改了数据,一级缓存中的数据也修改了,那么会将一级缓存和快照区的数据进行比对,如果不相同,就将数据存入数据库。
二级缓存
OpenSessionInView
1、创建一个工具类HIbernateUtils
private static SessionFactory factory;
static {
factory = new Configuration().configure().buildSessionFactory();
}
public static Session getSession() {
return factory.getCurrentSession();//将session与线程绑定
}
2、创建一个过滤器OpenSessionInViewFilter
Session session = HibernateUtils.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
chain.doFilter(request, response);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
} finally {
if (session != null) {
session.close();
}
}
3、在hibernate.cfg.xml中配置属性
thread
request(请求)->open session并开始transaction->controller->View(Jsp)->结束transaction并 close session.
有可能在chain.doFilter()被阻塞,因为有可能输出jsp的页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用户间传输时间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。
jpa
什么是jpa
java persistence api,java在持久层的一套接口,与jdbc接口类似,提供一套规范,有其他数据库厂商去实现
hibernate实现了jpa接口
基本用法
@Entity //表示该类为持久化类
@Table(name="user") //对应数据库的表名
public class User {
@Id //主键
@GeneratedValue(strategy=GenerationType.IDENTITY)//主键生成策略 IDENTITY与native类似
private Integer uid;
@Column(name="user_name") //设置属性名与字段名的映射关系
private String username;
private String password; //如果属性名与字段名一致,可以不写注解
}
注意:如果下面的注解不理解,请看上面xml配置映射关系的图
多对一
在多方设置@ManyToOne和@JoinColumn
@ManyToOne(cascade=CascadeType.ALL) //casacde为级联
@JoinColumn(name="uid") //外键
private User user;
一对多
在一方设置@OneToMany和@JoinColumn
@OneToMany(cascade=CascadeType.ALL) //casacde为级联
@JoinColumn(name="uid") //外键
private Set custSet = new HashSet<>();
多对多
在任意一方设置@ManyToMany和@JoinTable
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinTable(//生成第三张表
name="role_user",
joinColumns={@JoinColumn(name="uid")},//本表中的主键
inverseJoinColumns={@JoinColumn(name="rid")}//另一张表的主键
)
private Set roleSet = new HashSet<>();
双向的只要在另一个类中写同样的注解即可
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinTable(
name="role_user",
joinColumns={@JoinColumn(name="rid")},//本表中的主键
inverseJoinColumns={@JoinColumn(name="uid")}//另一张表的主键
)
private Set userSet = new HashSet<>();