get()方法是立即查询
load()方法是延迟查询,Person person = (Person)session.load(Person.class,1);这句话其实没有去查找数据库,只是返回了一个代理。当真正需要的时候才去查找数据库比如输出System.out.println(p.getName());这个时候才发出查找数据库,所以load()方法是延迟查询。如果输出的 是ID也不会发出查询语句,因为Person person = (Person)session.load(Person.class,1)这句话已经指定是那条数据了。好处是:对象很大的时候可以用load,当数据很小的时候不适应用load方法。当load()方法查询的id不存在的时候会报ObjectNotFoundException异常。get方法查询的id不存在不会报错返回null.
也可以在映射文件中配置使用lazy 让load方法变成立即查询。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 本文件就是一个java对象到关系数据库的映射配置文件 --> -<hibernate-mapping package="bean"> <!-- class 配置 类 对应表的映射配置 name 表示类名 table 表示关系数据库中的表名 --> -<class table="t_person" name="Person" lazy = "false"> <!-- id 指定Person类中那个属性是Id --> -<id name="id"> <!-- id生成策略 --> <generator class="native"/> </id> <!-- Person类的其他属性配置 name 对应 类的属性 column 对应表的字段名(如果没有设置column将使用name的值创建对应的列名) --> <property name="name" column="t_name"/> <property name="password" column="t_pass"/> <!-- type 表示指定属性 对应的hibernate类型 date 2013-02-17 time 17:02:28 timestamp 2013-02-17 17:03:07 默认 --> <property name="birthday" type="timestamp"/> </class> </hibernate-mapping>
时间: 2024-10-13 07:08:57