//因为hibernate不是马上执行sql,而是等t.commit()提交事务
//后才执行,clear后,对象为游离态
session.saveOrUpdate(fruit);//这里验证上面的话,执行update
//做个select查看一下,可以证明,因为clear后,没有马上执行
//sql语句,所以表里没有数据,这里update也没有用,所以表中
//一个对象也没插入,但是如果加入flush()刷新就是马上执行sql了
t.commit();
session.close();
}
public static void main(String[] args) {
// TODO 自动生成方法存根
Test t=new Test();
// t.test1();
// t.test2();
// t.test3();
t.test4();
}
}
hibernate API(二):
flush(): 从上面的例子可以看出,flush是刷新session的缓冲区,并执行里面的命令
flush()的事务管理模式: flushMode()里面有三个常量,可以用数字来表示
Load(): 另一种读取数据的方法,和get的区别是: 1.异常处理: load有异常处理,get没有,它返回null,2.get从数据库读数据,load可能去读缓冲区
事务的隔离级别:
在hibernate的数据库配置文件中设置
数字1为可以脏读,数字2为不能,这个是最常用的
锁机制:
避免并发冲突,在数据库中写数据是自动加锁的,读一般不加,有悲观锁和乐观锁
乐观锁是可以是hibernate程序自己加
实现乐观锁: 引例(hbn2包)
步骤:
1. 在表中加个version字段
2. 在持久类里加个version属性
3. 配置文件<version name=”versopm”> 每存一次值加1
引例:hbn2包
复杂的映射:
1. 基数关系映射
2. 继承关系映射
3. 组件关系映射
4. 集合映射
基数关系的映射—one to one:
基数关系的映射需要考虑的问题:
1. 数量问题
2. 方向问题
在one to one的关系中,我们有两种方法可以体现类与类之间的关系
1. 共享主键
2. 外键唯一
引例: Joto包-此包引用了fristHbn包
建立与Fruit类有一对一关系的类:
我们认为一个花有一个产地,一个产地生产一种花,所以要建立产地类
package Yuchen.Joto.business.entity;
//花的地址类
//问题:为什么不能在构造函数中写Fruit?因为生成对象后要持久化
//这个对象,但是数据库的表中不能插入另一个类的值,写上null又不
//大合适,所以就去掉它
public class Address {
private Integer aid;
private String nation;
private String postcode;
private Fruit fruit;
public Address() {
}
public Address(String nation, String postcode) {
super();
this.nation = nation;
this.postcode = postcode;
}
public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public Fruit getFruit() {
return fruit;
}
public void setFruit(Fruit fruit) {
this.fruit = fruit;
// fruit.setAddress(this);
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
}
修改Fruit类:
package Yuchen.Joto.business.entity;
//持久化类(花类),注意因为采用的是hilo的方式获得id,所以需要有setid的方法
public class Fruit {
private Integer fid;//hibernate中的id不能识别int
private String name;
private String comments;
private int price;
private Address address;//一朵花对应一个地址
public Fruit() {
super();
}
public Fruit(String name, String comments, int price) {
super();
this.name = name;
this.comments = comments;
this.price = price;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
address.setFruit(this);//因为当你给一个花设置产地的时候
//该产地也有了花
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public Integer getFid() {
return fid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price)

