1>:inverse关键字的使用
inverse关键字的作用:这个关键字的作用是反转(这个反转指的是当前的对象有没有维护对方的一个权力)
如果当前对象有维护对方的权利的话那么通过级联就可以正确的维护两个对象之间的关联关系
如果当前的对象没有权利维护对象的话那么即使你设置了级联那么两个对象之间的关联关系也是没有办法去维护的
inverse的使用方法: <set name="projects" table="t_relation" cascade="all" inverse="false">
inverse关键字对增删改查的影响
插入数据是有影响的
对查询数据有没有影响
对解除关联关系有没有影响
inverse对级联数据有没有影响 没有,但是他没有办法去维护这个关联的关系 也就是说 插入对方数据是没有问题 只是关系没有了....2>:Hibernate中对象的状态
Hibernate的对象有三种状态:临时状态、持久化状态、游离状态
1>:临时状态的特点
简单跟你说就是我们的对象创建创成功了 但是我们的对象和session目前没有任何的联系
临时状态的对象特点1>:在数据库中没有对应的记录
2>:这个对象也不属于我们的session管理
3>:这个对象完全是脱离Hibernate的
2>:持久化状态
1>:简单跟你说就是我们调用了 save/load/get/update/... 之后在session close之前的状态 这种状态称为持久化的状态
2>:持久化状态的数据 在数据库里面有对应的记录
3>:持久化状态的数据 属于session的管理
3>:游离状态
1>:就是我们调用了close方法之后 对象的一种状态
2>: 这种状态在数据库有对应记录
3>:这种状态的数据 不属于session的管理
4>:这种状态对象在内存里面存在 但是会被垃圾回收器给回收掉
3>:Hibernate的一级缓存
什么是Hibernate的一级缓存(一级缓存又叫session缓存也就是是缓存的管理完全是由seesion来控制的)
为什么要引入一级缓存呢?
是因为我们在做查询的时候可能在短时间内,我们要对同一个数据库里面的相同数据进行多次的查询、如果面对相同的数据要去数据库进行多次查询的话那么效率并不高,而且还增加了服务器的压力,但是以及缓存有个最大的特点是不能跨越session
一级缓存的测试如下(下面的代码只会生成一条SQL语句)
@Test
public void testQuery() throws Exception {
//获取我们的Session对象
Session session=HibernateUtils.getSession();
Developer developer=session.get(Developer.class,2);
Developer developer2=session.get(Developer.class,2);
Developer developer3=session.get(Developer.class,2);
Developer developer4=session.get(Developer.class,2);
System.out.println("查询回来的数据是:"+developer);
System.out.println("查询回来的数据是:"+developer2);
System.out.println("查询回来的数据是:"+developer3);
System.out.println("查询回来的数据是:"+developer4);
HibernateUtils.close();
}
一级缓存中常用的方法(clear:清空以及缓存中的内容 下面的代码会生成两条SQL语句)
public void testQuery() throws Exception {
//获取我们的Session对象
Session session=HibernateUtils.getSession();
Developer developer=session.get(Developer.class,2);
//清空以及缓存里面的所有内容
session.clear();
Developer developer2=session.get(Developer.class,2);
System.out.println("查询回来的数据是:"+developer);
System.out.println("查询回来的数据是:"+developer2);
HibernateUtils.close();
}
一级缓存的常用方法清空一级缓存中的指定对象(//清空指定的缓存的对象evict 下面的代码两条SQL语句)
public void testQuery() throws Exception {
//获取我们的Session对象
Session session=HibernateUtils.getSession();
Developer developer=session.get(Developer.class,2);
//清空以及缓存里面的所有内容
//清空指定的缓存的对象
session.evict(developer);
Developer developer2=session.get(Developer.class,2);
System.out.println("查询回来的数据是:"+developer);
System.out.println("查询回来的数据是:"+developer2);
HibernateUtils.close();
}
一级缓存中的方法session.flush(),从新获取数据库的数据(保持最新状态)
总结:一级缓存的使用范围小,作用不大
4>:session关闭后懒加载数据的使用
1>:那就在Session关闭之前使用一下
2>:强制代理对象初始化
Hibernate.initialize(developer.getProjects());
3>:关闭懒加载
4>:将整个配置文件的懒加载都关闭
default-lazy="false"
5>:组件映射
需求:使用Hibernate描述汽车和轮子之间的关系(轮子属于汽车的组件)
1>:轮子的实体描述如下:
public class Wheel implements Serializable{
private int wheelNum;
private String wheelName;
setter...
getter...
}
2>:汽车的实体类描述如下
public class Car implements Serializable{
private String carNum; //汽车的车牌
private String carName; //汽车名字
private Wheel wheel; //这个是汽车的轮子
setter...
getter..
}.
3>:汽车的映射文件如下
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--这里的package用来指定实体所在的包
这里的这个package是用来存放我们的实体类所在的包的
如果这里省略的话那么就需要在class的name上面编写全路径
-->
<hibernate-mapping package="com.qf.componet">
<class name="Car" table="t_car">
<!--配置主键-->
<id name="carNum">
<!--表示的是主键自己赋值-->
<generator class="assigned"></generator>
</id>
<!--配置其他的字段-->
<property name="carName"></property>
<!--下面就配置基于组件映射-->
<component name="wheel" class="Wheel">
<property name="wheelName"></property>
<property name="wheelNum"></property>
</component>
</class>
</hibernate-mapping>
4>:测试类如下
@Test
public void testComponent() throws Exception {
Session session=HibernateUtils.getSession();
//执行业务逻辑
session.save(new Car("川A:745B","宝马760",new Wheel(4,"xxxyyuu")));
HibernateUtils.close();
}