现在的位置: 首页 > 综合 > 正文

Hibernate高级模块解析

2019年03月07日 ⁄ 综合 ⁄ 共 1836字 ⁄ 字号 评论关闭
(奥斯科技首发)本地SQL查询--->>:
Hibernate <wbr>高级模块解析Hibernate <wbr>高级模块解析Hibernate <wbr>高级模块解析Hibernate <wbr>高级模块解析
实现方式:
Criteria ca = session.createCriteria(Stuff.class);
ca.createCriteria("department");
ca.createCriteria("position");
List stuffs = ca.list();
for (Stuff stuff : stuffs) {
System.out.println(stuff.getName());
System.out.println(stuff.getDepartment().getName());
System.out.println(stuff.getPosition().getName());
}
tx.commit();
命名查询--->注解方式:
放置位置级实现:
 * Department entity. @author MyEclipsePersistence Tools
 */
@Entity
@Table(name = "DEPARTMENTS", schema = "LOVESMILE")
//@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@NamedQuery(name="sel_dpt_po",query="select distinct dpt fromDepartment as dpt left join fetch dpt.stuffs as s left join fetchs.position")
public class Department implements java.io.Serializable{
在注解实体类添加@NamedQuery(....);
在业务中调用方式:
 Queryquery=session.getNamedQuery("sel_dpt_po");---->参数为@NamedQuery的name值
乐观锁--->注解方式:
private Integer version;
@Version
@Column(name = "VERSION")
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
注意:
需要在数据表中添加一个数字类的列作为版本控制,此程序中为version
Criteria 查询:
其他一些知识:
flush时将一级缓存与数据库同步
1.大量操作数据时可能造成内存溢出,解决办法如下:
for(inti=0;i<100000;i++){session.save(obj);
if(i% 50 == 0){session.flush(); session.clear();}
}
2.用StatelessSession接口:它不和一级缓存、二级缓存交互,也不触发任何事件、监听器、拦截器,通过该接口的操作会立刻发送给数据库,与JDBC的功能一样。
StatelessSession s =sessionFactory.openStatelessSession();该接口的方法与Session类似。
3.Query.executeUpdate()执行批量更新,会清除相关联的类二级缓存(sessionFactory.evict(class)),也可能会造成级联,和乐观锁定出现问题
update Department as dpt set dpt.name='部门2' where dpt.id=2”
4.悲观锁:Criteria.setLockMode,Query.setLockMode,Session.lock 
乐观锁:< version   column = "version "    name = " version "    type = " java.lang.Integer "   /> 
使用list()方法获取查询结果,每次发出一条查询语句,获取全部数据
使用iterate()方法获取查询结果,先发出一条SQL 语句用来查询满足条件数据的id,然后依次按这些id查询记录,也就是要执行N+1 条SQL 语句(N 为符合条件的记录数)
list()方法将不会在缓存中读取数据,它总是一次性的从数据库中直接查询所有符合条件的数据,同时将获取的数据写入缓存
 iterate()方法则是获取了符合条件的数据的id 后,首先根据id在缓存中寻找符合条件的数据,若缓存中无符合条件的数据,再到数据库中查询
---来自微笑风采的博客

抱歉!评论已关闭.