【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),POJOMAP

getSessionEntityMode) 或者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: 强制对写入二级缓存的内容进行刷新
7.openSession()和getCurrentSession()
openSession():autoCloseSessionEnabled为false,不会在每次执行后自动关闭session。对于多线程(也就是多次请求),打开一次session就会产生一个连接。
getCurrentSession():事务交由hibernate管理(自己不写事务),每次执行后自动提交。

session.disconnect() session断开连接返回给连接池,前提session未关闭。session依然存在!(这个方法的名字太容易让人误解了,调用该方法后,其实数据库的连接依然存在,处于sleep状态,要关闭数据库的sleep进程,需要连接池来断开连接,或者直接关闭应用)
session.close()关闭session
sessionFactory存储了connection,和hibernate的配置,同时管理session。




关于hibernate的配置,大家可以看下SettingsFactory这个类


0 0
原创粉丝点击