hibernate操作对象的三种状态
1.瞬时态 对象没有id并且没有与session产生联系
2.持久态 有id并且与session产生了联系
3.游离态 有id但没有session产生联系
总结:hibernate在你提交事务之后,会把持久态的对象同步到数据库之中
查询数据库时hibernate是如何操作的
在查询时数据库返回的结果集会被hibernate封装成对象并且在缓存与快照中各自保存一份,
之后再去数据库中查询时,会现在缓存中查看是否存在这个id的对象,如果存在就会返回缓存中的对象.
这时,修改对象修改的是缓存中的对象记录,在提交事务时,hibernate会对比缓存与快照中的对象,
看是否发生改变,如果发生改变就会将缓存中的对象同步到数据库中.
在HQL中还可以是使用:号占位符 在替换时直接使用:号后面的名字即可 注意:冒号后面不要在空格
HQL中的分页:
//使用HQL查询所有User记录
Session session = HibernateUitl.getOpenSession();
Transaction transaction = session.beginTransaction();
String hql = "from User ";
Query<User> query = session.createQuery(hql, User.class);
//添加分页
//limit first,max
query.setFirstResult(0);
query.setMaxResults(2);
List<User> list = query.list();
System.out.println(list);
transaction.commit();
session.close();
配置:一对多的xml文件
<!-- 配置一对多关系
name 表示实体类对象中存放另一个实体类的容器名
column 两张表联系的外键 外键声明在多的一方中
注意:两张表外键名必须填一致,否则会多创建一个外键出来
class 与哪个类进行联系
-->
<!-- 级联操作 cascade
作用:简化你的代码量(量不大)
save-update 级联保存和更新
delete 级联删除
all save-update + delete
-->
<!--
inverse(反转控制 默认值是false 不放弃维护外键 ) 作用:可以提高效率
一对多的表关系 如果要放弃维护外键关系 只能是一的一方放弃维护
-->
<set name="linkmans" cascade="save-update" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="Linkman"/>
</set>
<!-- 配置多对一的关系
name 表示多对一对象中声明的另一个实体类的成员变量名
class 表示 与哪个类进行联系
column 两张表联系的外键
注意:上面再配置property时不要重复配置外键
-->
<many-to-one name="customer" class="Customer" column="lkm_cust_id" ></many-to-one>
配置多对多的关系:
<!-- 配置多对多关系
name 容器的名字
table 中间表的名字
key 中间表引用我的id
many-to-many column="对应那个表的外键(引用那个表的键)" class="对应的那个表的类名"
-->
<!-- 多对多时 必须要有一方放弃对外键的维护 -->
<set name="roles" table="sys_user_role" inverse="true">
<key column="user_id"></key>
<many-to-many column="role_id" class="Role"></many-to-many>
</set>