摘要:
今天做项目的时候,有两个实体:款式、品牌两者关系是多对多的关联关系,实现的功能是:通过选择款式,显示出该款式的所有品牌。HQL语句如下:1 from Brand as b where b.styles.styleId=? 运行时出现这个异常错误:org.hibernate.QueryException:illegalattempttodereferencecollection。 通过查资料发现,在上面的HQL语句中,Brand的关联实体styles是一个Set集合,而不是一个Style实体。在Hibernate3.2.2以前的版本,Hibernate会对关联实体自动使用隐式的innerjoi. 阅读全文
摘要:
在Struts2中,Action处理完用户请求后,将会返回一个字符串对象,这个字符串对象就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把相应的物理视图呈现给浏览者。 Struts2的结果类型决定了Action处理结束后,下一步将会调用那种视图资源来呈现处理结果。默认是dispatcher,该结果类型指定使用JSP作为视图资源。但是我们会有这样的要求:要求从一个Action转到另一个Action中去。从一个Action直接跳到另一个Action中,Struts提供了两种结果类型可以实现:chain、redi.. 阅读全文
摘要:
首先我们先来看如下代码示例:1 public class Test_1 {2 public static void main(String[] args) {3 System.out.println(0.06+0.01);4 System.out.println(1.0-0.42);5 System.out.println(4.015*100);6 System.out.println(303.1/1000);7 }8 9 } 运行结果如下。0.069999999999999990.58000000000... 阅读全文
摘要:
今天做项目时,使用拦截器对用户权限检查。拦截器本身没有问题,可是实现权限拦截,但是传递的参数全部都无效了。搞了很久,由于对拦截器的内部机制不是特别熟悉,所以重新研读了一下Struts2的拦截器。找到了原因:给一个Acton配置一个自定义拦截器后,此action就无法使用框架默认的拦截器栈了,这就导致前后台数据传输无效。解决方法一般有两种:一、显示的使用默认拦截器 1 <action name="enterSystem_*" class="enterSystemManager" method="{1}"> 2 3 <! 阅读全文
摘要:
在使用Hibernate的过程我们会遇到多个人对同一数据同时进行修改,这个时候就会发生脏数据,造成数据的不一致性。为了避免更新数据的丢失,Hibernate采用锁机制。 Hibernate提供了两种锁机制:悲观锁和乐观锁。 悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改。 乐观锁:在对数据进行修改的时候,对数据采用版本号或者时间戳等方式来比较,数据是否一致性来实现加锁。一、悲观锁 悲观锁是依靠数据库提供的锁机制。Hibernate是通过使用数据库的forupdate子句实现了悲观锁机制。 Hibernate有如下五种加锁机制 1、LockMode.NONE. 阅读全文
摘要:
Hibernate执行持久化过程中,应用程序无法参与其中。所有的数据持久化操作,对用户都是透明的。 通过事件框架,Hibernate允许应用程能响应特定的内部事件,从而允许实现某些通用的功能或者对Hibernate功能进行扩展。 Hibernate的事件机制框架由两个部分组成: 1、拦截器机制:对于特定动作拦截,回调应用中的特定动作 2、事件系统:重写Hibernate的事件监听器。一、拦截器 Interceptor接口提供了从会话回调应用程序的机制,这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。 通过Interceptor接口,可以在数据进. 阅读全文
摘要:
缓存的作用主要是用来提高hibernate的性能,可以简单的理解成一个map。使用缓存涉及到三个操作:把数据放入缓存、从缓存中取数据、删除缓存中的无效数据。一、一级缓存一级缓存是Session级共享的。对于一级缓存而言,所有经过Session操作的实体,不管是使用save()、upadate()或者saveOrUpdate保存一个对象,还是使用load()、get()、list()、iterate()、scroll()方法获得一个对象时,该对象都将被放入一级缓存中。1 session = HibernateUtil.getSession();2 ... 阅读全文
摘要:
懒加载是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。一、load方法的懒加载先看如下代码段 1 public class UserManager { 2 3 public static void main(String[] args) { 4 Users user = new Users(); 5 user.setBirthday(new Date()); 6 7 Name name = new Name(); 8 name.setFirstName(... 阅读全文
摘要:
Hibernate3提供了一种创新的方式来处理具有“显性(visibility)”规则的数据,那就是使用Hibernatefilter。Hibernatefilter是全局有效的、具有名字、可以带参数的过滤器,对于某个特定的Hibernatesession您可以选择是否启用(或禁用)某个过滤器。 一旦启用了数据过滤器,则不管是数据查询,还是数据加载,该过滤器将自动作用于所有数据,只有满足过滤条件的记录才会被选出来。 过滤器条件相当于定义一个非常类似于类和各种集合上的“where”属性的约束子句,但是过滤器条件可以带参数。应用程序可以在运行时决定是否启用给定的过滤器,以及使用什么样的参数值。过. 阅读全文
摘要:
条件查询一般是通过以下三个类完成的: 1、Criteria:代表一次查询 2、Criterion:代表一个查询条件 3、Restriction:代表查询条件的工具类 执行条件查询的步骤如下: 1、获得Hibernate的Session对象 2、以Session对象创建Criteria对象3、使用Restriction的静态方法创建Criterion查询条件 4、向Criteria查询中添加Criterion查询条件 5、执行Criterion的list()方法或者uniqueResult()方法返回结果集 示例: 1 public void query(){ 2 Se... 阅读全文
摘要:
Hibernate除了支持HQL查询外,还支持原生SQL查询。 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。 执行SQL查询步骤如下: 1、获取HibernateSession对象 2、编写SQL语句 3、通过Session的createSQLQuery方法创建查询对象 4、调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联,分别用于进行标量查询或实体查询 5、如果SQL语句包含参数,调用Query的setXxxx方. 阅读全文
摘要:
Hibernate提供了强大的查询系统,使用Hibernate有多种查询方法可以选择:可以使用Hibernate的HQL查询,也可以使用条件查询,甚至可以使用原生的SQL查询语句。其中HQL查询时Hibernate配置的功能强大的查询语句。HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。一、HQL查询HQL的语法和SQL很相似,但是HQL是一种面向对象的查询语句,它的操作对象是类、实例、属性等,而SQL的操作对象是数据表、列等数据库对象。由于HQL是完全面向对象的查询语句,因此可以支持继承、多态等特性。HQL查询依赖于Query类,每一个Query实例对 阅读全文
摘要:
Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象,将被自动转换为对数据库的操作。但存在这样一个问题,如果我们想同时更新100000条记录,是不是要逐一加载100000条记录,然后依次调用setter方法。采用这种方法实在是太繁琐了,而且严重影响了数据的访问性能。Hibernate提供的批量处理的方案来解决这个问题。一、批量插入 如果我们需要插入100000条记录,通过hibernate可能会采用如下的方式处理: 1 Session session = HibernateUtil.getSession(); 2 Tran... 阅读全文
摘要:
对于面向对象的程序设计语言,继承、多态是两个最基本的概念。Hibernate的继承映射可以理解两个持久化类之间的继承关系。 Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hibernate的多态查询都可以很好的运行。 假设有四个对象:Department、Employee、Skiller、Sales。他们四个对象存在如下关系: 从上面的关系可知:Employee与Department之间存在N-1的关联关系。Skiller和Sales都是Employee的子类。下面是这四个类的代码: Department1 public class Department {2 pri... 阅读全文
摘要:
先看User持久化类: 1 public class Users { 2 private int id; 3 private Date birthday; 4 private Name name; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) {11 this.id = id;12 }13 14 public Date getBirthday() {15 return birthd... 阅读全文