【java知识点】hibernate
来源:互联网 发布:收购淘宝小号 编辑:程序博客网 时间:2024/06/06 09:39
1.subclass、union subclass、joined subclass的使用
类设计:子类都继承父类,如鸭子类和鸡类都继承动物类
表设计:subclass内嵌表,即子类父类同一张表,用鉴别器(就是额外一个字段)来区别类型;
union subclass、joined subclass都是子类单独一张表(除非在映射文件中配置父类的属性abstract抽象为true)
union subclass,理解为加入或者联合子类,子类父类两张表的数据不共用,即子类表有鸭子A,父类表没有对应的动物A,如果要查询所有的动物,需要查询父表和所有的子表。子表包括父表所有字段,以及子表本身额外的字段
joined subclass,理解为子类引用,子类表数据引用父类表,子表包括父表主键的引用和本身额外的字段,用该引用字段做子表主键,如duck表用animal_id做主键
查询例句: HibernateUtil.getSession().createQuery("select id as id,duck_name as name from Duck").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
2.事务
对应配置中的current_session_context_class,选项有三个:thread(jdbc事务),jta,manage(自己管理)
thread就是在一个方法中(例如在dao层daoImpl一个方法),具体执行处理的地方,自己声明和提交事务:
Transaction transaction = session.beginTransaction();
//业务部分
transaction.commit();
jta事务需要容器支持,由容器提供分布式事务管理,Tomcat本身不具备此能力,JBoss、WebLogic具备
jta就是在请求入口,业务处理层面(不关心具体的执行),如controller层/action层/service层,处理多个执行接口:
Transaction transaction = session.beginTransaction();
//业务1 userDao.pay()
//业务2 orderDao.updateState()
//等等transaction.commit();
manage:自己创建连接,控制释放?作者太懒,这个没去细看。
Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的Transaction的时候,那么就千万不要使用Hibernate的Transaction(摘自:http://blog.csdn.net/w302974215/article/details/49668355)
先启动事务,再启动session,这也是为什么jta可以跨session管理的原因
3.releaseMode连接释放模式
after_transaction 在每一次事务之后释放,默认
after_statement 在每一次sql语句执行后释放,该模式应该只在jta事务中使用
on_close 在session关闭或者断开连接时释放,这个应该是为其他框架提供的选项
4.EntityMode:DOM4J(返回ELement,用于生成xml),POJO,MAP
getSession(EntityMode) 或者setResultTransformer(Transformers)切换返回类型
5.FlushMode:
NEVER(从不flush,同MANUAL)
MANUAL(手动flush)
COMMIT(在事务提交时flush)
ALWAYS(每次执行sql都flush)
AUTO(hibernate判断是否flush)
6.cacheMode:
- IGNORE: 禁用二级缓存
- NORMAL: 启用二级缓存,正常读写
- GET: 只从二级缓存读,除非有数据update
- PUT: 只向二级缓存写
- REFRESH: 强制对写入二级缓存的内容进行刷新
openSession():autoCloseSessionEnabled为false,不会在每次执行后自动关闭session。对于多线程(也就是多次请求),打开一次session就会产生一个连接。getCurrentSession():事务交由hibernate管理(自己不写事务),每次执行后自动提交。session.disconnect() session断开连接返回给连接池,前提session未关闭。session依然存在!(这个方法的名字太容易让人误解了,调用该方法后,其实数据库的连接依然存在,处于sleep状态,要关闭数据库的sleep进程,需要连接池来断开连接,或者直接关闭应用)session.close()关闭sessionsessionFactory存储了connection,和hibernate的配置,同时管理session。关于hibernate的配置,大家可以看下SettingsFactory这个类
- 【java知识点】hibernate
- hibernate知识点
- Hibernate知识点
- hibernate 知识点
- hibernate知识点
- Hibernate知识点
- Hibernate知识点
- hibernate知识点
- Hibernate知识点
- Hibernate知识点
- java面试要点---Hibernate面试系统知识点复习,hibernate原理,缓冲---随时更新
- Hibernate的一些知识点
- Hibernate-小知识点
- Hibernate知识点 001
- Hibernate知识点 002
- Hibernate 知识点总结
- Hibernate知识点总结
- hibernate知识点---query.list()
- 鸡汤分享--如何成为高手
- linux中的find命令——查找文件名
- java中map list转换json类型回传到前端
- 第五周 项目5 后缀表达式
- oracle基础教程(第四天)数据库管理
- 【java知识点】hibernate
- 学习日志第8篇
- Android 源码在线查看网站
- 【Android 应用开发】Android 开发之JNI入门 - NDK从入门到精通
- 关于osg的内容研究学习
- Java开源世界
- 1032 挖掘技术哪家强
- 几个好看的字体颜色
- [学习笔记] 微信公众平台 · 小程序 ·Q&A