1、Hibernate Tools for Eclipse Plugins
hibernate被jboss收购 下载最新的也可以
到http://tools.jboss.org/downloads/ 下载包(Artifacts下面)
下载好包后,在eclipse->help->install new software location选择下载好的包
只选择hibernate tools安装 安装过程会提示认证问题 点OK就行(可能是不同的eclipse版本)
2、下载hibernate.jar包 导入hibernate-core.jar中的dtd(configuration mapping)文件
有提示功能
key -//Hibernate/Hibernate Configuration DTD 3.0//EN <public ID>
key -//Hibernate/Hibernate Mapping DTD 3.0//EN <public ID>
3、session的获得方式
A、SessionFactory.openSession()
B、getCurrentSession() 需要在cfg.xml中配置
本地事务(jdbc事务) <property name="hibernate.current_session_context_class">thread</property>
全局事务(jta事务) <property name="hibernate.current_session_context_class">jta</property> (用的较少)
A:每次回创建新的对象 / 不会自动关闭,多次未关闭可能会导致连接池的溢出 <关闭不等于对象销毁,是释放到连接池中>
B:使用现有的session对象(类似单例) / 会在提交和事务回滚自动关闭
3、报错记录
A、出现报错信息 near 'type=myisam' 报错:一般是数据库方言问题 较高版本的hibernate对MySQL高版本支持
org.hibernate.dialect.MySQLDialect 改成org.hibernate.dialect.MySQL57Dialect或者org.hibernate.dialect.MySQL5Dialect
B、报错信息有 'useSSL=true' 'use=false' 应该是要设置是否使用ssl传输数据库
因为高版本的MySQL支持SSL
C、hibernate对数据库的操作都封装在事务中,默认是非自动提交,使用session如果没有开启事务,手动提交事务,对象并不会真正保存到数据库;
如果想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork(方法),获得jdbc的connection后设置为自动提交模式
最后调用session.flush()<!不推挤>
4、hibernate的CURD
save()
update()
delete()
get()/load()查询单个记录
区别:get 不考虑缓存情况,会直接发送sql语句,返回持久化对象 / 数据库中不存在这个对象是 返回是null
load 方法调用后返回一个代理对象,该对象只保存实体对象的ID,用到非主键属性时才会发送sql语句 / 数据库中不存在,会抛java.hibernate.ObjectNotFindException
热门评论
四、一级/二级缓存
一级缓存:session/会话级缓存,生命周期跟随session,应用范围为当前会话/事务范围,<将查询的对象保存在应用程序内存中,下次需要会在内存中查找,如果未命中则执行sql>
管理:session.evict(obj)将某个对象从session缓存中清除,session.clear()将session缓存中所有对象清除
测试代码:将会执行一条查询sql
session1 = factory.openSession();
Employee emp1 = (Employee)session1.get(Employee.class,1);
session2 =factory.openSession();
Employee emp2 = (Employee)session2.get(Employee.class,1);
二级缓存:全局缓存/应用级缓存,适用所以会话(比如参考数据)
a.添加jar包,
b.在配置文件中添加provider类描述,指定二级缓存中实现类
<session-factory><property name="cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property></session-factory>
c.添加二级缓存属性配置文件,ehcache.xml文件
d.在需要被缓存的表的配置文件中添加<cache/>标签 <cache usage="read-only"></cache>
使用缓存策略:read-only ,read-write,transactional,nonstrict-read-writer
其他属性:include= [all , non-lazy 不缓存延迟加载的对象] region=[指定二级缓存区域名,在ehcache中定义缓存区域名]
7、Many2ManyTest
/*
* eclipse中可以建立数据库连接<需要驱动>,编写sql脚本,并执行脚本
*/
@Test
public void testMany2Many()
{
Employee emp1 = new Employee(1,"慕女神");
Employee emp2 = new Employee(2,"imooc");
Project pro1 =new Project(1001,"项目一");
Project pro2 =new Project(1002,"项目二");
//此时已经建立了双向的关联关系,可以使用inverse设置谁来维护关联关系,cascade级联保存设置,实际上这两个属性一定要设置
pro1.getEmployees().add(emp1);
pro1.getEmployees().add(emp2);
pro2.getEmployees().add(emp1);
session.save(pro1);
session.save(pro2);
}
<!-- hibernate.default_schema创建表的时候会加上该属性值作为 表名前缀 -->
<!-- 控制台输出sql语句 -->
<property name="show_sql">true</property>
<!-- 输出格式化sql -->
<property name="format_sql">true</property>
<!-- 自动DDL,表操作策略,如第一次向不存在的表中插入数据会自动创建表 -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="entity/Project.hbm.xml"/>
<mapping resource="entity/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>