Hibernate对象状态
Hibernate三种状态:
1: 瞬时态 : 没有id即没保存,也脱离了sesion
2: 持久态 : 已经保存到数据库(有着完整的属性)
3:托管态 : 一个完整的对象,但是脱离了sesion
例:
public void test(){ //三种状态相对于book实例而言
Session session=HibernateUtils.getSession();
Transaction t=session.beginTransaction();
Book book =new Book(); //瞬时态
book.setName("thinkings");
book.setPrice(99d);
session.save(book); //持久态
t.commit();
session.close();
System.out.println(book); //脱离
}
一级缓存与Hibernate快照
一级缓存: 是指Session缓存
Hibernate快照: Session缓存于快照做对比,看什么时候更新
一级缓存特点:get list获取对象一级缓存中存在直接用,无需sql语句,没有则去MySQL查询,同时放在缓存
:save update操作数据对象时,flush(),保存在MySQL,同时会在Sesion存在复制一份
:close()关闭,会清空Session缓存
:按照缓存的状态更新数据库即 Flush()刷出缓存
一级缓存作用:减少对数据库的访问次数
什么时候刷出缓存 FLush(): 1: Transaction.commit()
2: 持久化属性变化,会先刷出缓存保障持久化的最新状态
3: 主动调用 flush()方法,即update
Hibernate快照特点:session.flush()缓存刷出依赖于快照
: save()时复制一份给Session同时也会给快照一份
注意:update()只给复制一份给Sesion,不会给Hibernate快照
此时如果 持久化属性变化(缓存和快照不同)则会flush()即update
Flush 输出缓存 即updat()数据库
Hibernate关联关系映射
一对一 1:1 一对多 1:n 多对多 m:n
class A{ class A{ class A{
B b; Set<B> b; Set<B> b;
} } }
class B{ class B{ class B{
A a; A a; Set<A> a;
} } }
在hibernate.cfg.xml中配置 自动建表或更新表
<property name="hibernate.hbm2ddl.auto">update</property>
create
//根据不同情况,使用不同属性
1:n 关联关系映射 在n中加外键
Customer表 1:n关系 Order表:
id id
name address
Set<Order>orders price
customer //外键
映射关系:两个类,都要将互相两边的映射关系都要写出来
Customer.hbm.xml中:
<set name="orders" > // <set>标签可以理解会 被映射类orders
<key column="cid" /> // <key column>写书 映射类中的外键名
<one-to-many class="Order"/> // 写出映射类的名字
</set>
Order.hbm.xml中:
<many-to-one name="customer" class="Customer” column="cid" />
//属性Customer //对应类 //column 对应表中的字段
m:n 多对多关系映射
Student表 s_c表 Course表
id sid id
sname cid cname
Set<Course>courses Set<Stduent>students
Student.hbm.xml中:
<set name="courses" table="s_c" > // 此类生成的外键 放在那张表
<key column="sid" /> // 此类在对应表的 外间列名称
<many-to-many class="cn.itcast.manytomany.Course" column="cid" />
</set> //描述对应关系类及其名字
Course.hbm.xml中:
<set name="students" table="s_c" > // 此类生成的外键 放在那张表
<key column="cid" /> // 此类在对应表的 外间列名称
<many-to-many class="cn.itcast.manytomany.Student" column="sid"/>
</set> //描述对应关系类及其名字
反转
Student表 s_c表 Course表
id sid id
sname cid cname
Set<Course>courses Set<Stduent>students
将Course.hbm.xml 中
<set inverse="true" > 表示反转关系,放弃对另一端的维护
默认false 表示需要维持关系
1:n: 将 1 设置 inverse=true ,表示有多的一方维护关系
都不设置反转,两边可以同时维护关系,也不会出错,但会多余sql语句
有一方维持则可以
m:n: 任意一方都可以
都不设置反转,两边不能同时维护关系,会出错误,由一方维护则可以
级联
cascade: 表示主控方 save update delete 其关联对象也会执行相同操作
save-update:表示save update saveOrUpdate
delete :表示detele 对应方也会删除
:不过没有delete级联 则对应方外键会成null
delete-orphan : 都对象的外键解除关系,则会成null,则会删除
all : 所有关联操作,不包括 孤儿删除
none : 默认,不进行任何操作