@yudesong
2018-02-17T07:20:24.000000Z
字数 4763
阅读 636
Hibernate
【1】一级缓存也叫session级缓存或事务级缓存,一级缓存的生命周期和Session的生命周期一致,也就是当 session关闭时缓存即被清除,一级缓存在Hibernate中是不可配置的,即不能被卸载。 当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。
【2】二级缓存也称进程级缓存或SessionFactory级缓存,二级缓存可以被所有的session共享,二级缓存的生命周期和SessionFactory的生命周期一致。二级缓存在Hibernate中是可以配置的,可以通过class-cache配置类粒度级别的缓存(class-cache在class中数据发生任何变化的情况下自动更新),同时也可通过collection-cache配置集合粒度级别的缓存(collection-cache仅在 collection中增加了元素或者删除了元素的情况下才自动更新,也就是当collection中元素发生值的变化的情况下它是不会自动更新的)。
//开发人员信息public class Developer {private Integer d_id;//开发人员编号private String d_name;//开发人员姓名//开发人员参与的多个项目private Set<Project> projects=new HashSet<Project>();public Integer getD_id() {return d_id;}public void setD_id(Integer d_id) {this.d_id = d_id;}public String getD_name() {return d_name;}public void setD_name(String d_name) {this.d_name = d_name;}public Set<Project> getProjects() {return projects;}public void setProjects(Set<Project> projects) {this.projects = projects;}}public class Project {private Integer prj_id;//项目编号private String prj_name;//项目名称//项目下的多个员工private Set<Developer> developers=new HashSet<Developer>();public Integer getPrj_id() {return prj_id;}public void setPrj_id(Integer prj_id) {this.prj_id = prj_id;}public String getPrj_name() {return prj_name;}public void setPrj_name(String prj_name) {this.prj_name = prj_name;}public Set<Developer> getDevelopers() {return developers;}public void setDevelopers(Set<Developer> developers) {this.developers = developers;}}<!-- Developer.hbm.xml --><hibernate-mapping package="cn.itcast.c_many2many"><class name="Developer" table="t_developer"><id name="d_id"><generator class="native"></generator></id><property name="d_name"></property><set name="projects" table="t_relation"><key column="did"></key><many-to-many column="prjId" class="Project"></many-to-many></set></class></hibernate-mapping><!-- Project.hbm.xml --><hibernate-mapping package="cn.itcast.c_many2many"><class name="Project" table="t_project"><id name="prj_id"><generator class="native"></generator></id><property name="prj_name"></property><!-- 多对多映射:1.映射的集合属性:developers2.集合属性:对应的中间表,t_relation3.外键字段:prjid4.外键字段:对应的中间表字段,did5.集合属性元素的类型 --><set name="developers" table="t_relation"><key column="prjId"></key><many-to-many column="did" class="Developer"></many-to-many></set></class></hibernate-mapping>
Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。
// FROM 语句String hql = "FROM Employee";Query query = session.createQuery(hql);List results = query.list();// AS 语句String hql = "FROM Employee AS E";// String hql = "FROM Employee E";Query query = session.createQuery(hql);List results = query.list();// SELECT 语句String hql = "SELECT E.firstName FROM Employee E";Query query = session.createQuery(hql);List results = query.list();// WHERE 语句String hql = "FROM Employee E WHERE E.id = 10";Query query = session.createQuery(hql);List results = query.list();//ORDER BY 语句String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";//String hql = "FROM Employee E WHERE E.id > 10 " +"ORDER BY E.firstName DESC, E.salary DESC ";Query query = session.createQuery(hql);List results = query.list();// GROUP BY 语句String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " + "GROUP BY E.firstName";Query query = session.createQuery(hql);List results = query.list();// 使用命名参数String hql = "FROM Employee E WHERE E.id = :employee_id";Query query = session.createQuery(hql);query.setParameter("employee_id",10);List results = query.list();// UPDATE 语句String hql = "UPDATE Employee set salary = :salary " +"WHERE id = :employee_id";Query query = session.createQuery(hql);query.setParameter("salary", 1000);query.setParameter("employee_id", 10);int result = query.executeUpdate();System.out.println("Rows affected: " + result);// DELETE 语句String hql = "DELETE FROM Employee " +"WHERE id = :employee_id";Query query = session.createQuery(hql);query.setParameter("employee_id", 10);int result = query.executeUpdate();System.out.println("Rows affected: " + result);// INSERT 语句String hql = "INSERT INTO Employee(firstName, lastName, salary)" +"SELECT firstName, lastName, salary FROM old_employee";Query query = session.createQuery(hql);int result = query.executeUpdate();System.out.println("Rows affected: " + result);//聚合方法方法 描述avg(property name) 属性的平均值count(property name or *) 属性在结果中出现的次数max(property name) 属性值的最大值min(property name) 属性值的最小值sum(property name) 属性值的总和// distinct 关键字表示只计算行集中的唯一值。下面的查询只计算唯一的值:String hql = "SELECT count(distinct E.firstName) FROM Employee E";Query query = session.createQuery(hql);List results = query.list();// 使用分页查询String hql = "FROM Employee";Query query = session.createQuery(hql);query.setFirstResult(1);query.setMaxResults(10);List results = query.list();
为了使用批处理这个特性,首先设置 hibernate.jdbc.batch_size 作为批处理的尺寸,取一个依赖于对象尺寸的值 20 或 50。这将告诉 hibernate 容器每 X 行为一批插入。
<property name="hibernate.jdbc.batch_size">50</property>