hibernate的flush和操作方式
操作hibernate不是直接操作数据库,hibernate在其中又加入一层缓存,而正是因为这层缓存的原因,很多时候我们需要认真去分析我们的sql执行顺序,不要引起意外情况,下面这张图是描述了uuid和native两种主键策略下,各种操作的流程:
hibernate的flush原理.png
当执行save/update/delete等操作后,hibernate并不是直接生成sql语句执行,而是先把操作存入actionQueue的相应队列中,然后再把当前操作对象缓存到persistenceContext中
只有主键需要数据库生成时,在做save等操作的时候,才会直接发出sql语句去数据库中执行
在commit或者flush执行时,要检查User对象,persistenceContext的User对象缓存以及actionQueue中的对象引用,数据上是否一致,没有出现单独被修改的情况,否则会抛出异常
actionQueue和persistenceContext的具体位置请参看下图,网络上说的有些路径和我的不一致,有可能是版本的问题,请自行检查。
1.png
2.png
3.png
接下来就是对各种主键策略的代码测试,具体测试内容,请看代码中的注释:
实体类:
package entity;
import java.util.Date;
public class User {
private int id;
private String userName;
private Date addtime;
public Date getAddtime() {
return addtime;
}
public void setAddtime(Date addtime) {
this.addtime = addtime;
}
public User(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
映射文件:
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.ne