one-to-many的懒加载及原理分析

如果是一对多,多对一,甚至是多对多那效率就差别大了!!如果一对多lazy=”false”或者fetch=”join”会同时查询出所有关联的对象,对数据库和对网络影响将是很大地。(lazy=”false” 采用多条查询语句,比如,一对100:会有可能101条select查询语句;fetch=”join” 会同时访问两个表的)

但是代理对象调用getClass()和getId()方法的时候不会立刻加载,.class和id的信息是随对象的!


domain对象
public class User {

private Integer id;
private String name;
private Float wage;
private Set<Book> bookSet = new HashSet<Book>();


public class Book {

private Integer id;
private String bookname;
private User user;


映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.lazyOneToOne">

<class name="User" table="user" lazy="false">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<property name="name" />
<property name="wage"/>
<set name="bookSet" lazy="false" fetch="select">
<key column="u_id"/>
<one-to-many class="Book"/>
</set>

</class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.lazyOneToOne">

<class name="Book" table="book">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<property name="bookname" />

<many-to-one name="user" column="u_id"/>

</class>
</hibernate-mapping>



测试代码:

User user = (User)session.get(User.class, 1);


此时的sql语句为:
Hibernate: 
select
user0_.id as id0_0_,
user0_.name as name0_0_,
user0_.wage as wage0_0_
from
user user0_
where
user0_.id=?
Hibernate:
select
bookset0_.u_id as u3_1_,
bookset0_.id as id1_,
bookset0_.id as id1_0_,
bookset0_.bookname as bookname1_0_,
bookset0_.u_id as u3_1_0_
from
book bookset0_
where
bookset0_.u_id=?


如果映射文件改为:

<set name="bookSet"  lazy="false" fetch="join">
<key column="u_id"/>
<one-to-many class="Book"/>
</set>


sql语句为:

Hibernate: 
select
user0_.id as id0_1_,
user0_.name as name0_1_,
user0_.wage as wage0_1_,
bookset1_.u_id as u3_3_,
bookset1_.id as id3_,
bookset1_.id as id1_0_,
bookset1_.bookname as bookname1_0_,
bookset1_.u_id as u3_1_0_
from
user user0_
left outer join
book bookset1_
on user0_.id=bookset1_.u_id
where
user0_.id=?


如果映射文件为:

		<set name="bookSet"  lazy="true">
<key column="u_id"/>
<one-to-many class="Book"/>
</set>



只是访问一个表了:
Hibernate: 
select
user0_.id as id0_0_,
user0_.name as name0_0_,
user0_.wage as wage0_0_
from
user user0_
where
user0_.id=?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "subscript on non-array or too many dimensions" 的意思是在非数组或维度过多的情况下进行下标操作。这通常是因为代码使用了错误的数据类型或维度不匹配导致的错误。需要检查代码并确保使用正确的数据类型和维度。 ### 回答2: "Subscript on non-array or too many dimensions"是一种错误提示,通常出现在使用数组时。它表示代码尝试在非数组对象上执行下标操作,或者尝试使用超出数组维数的索引。 在编写代码时,开发者通常使用数组来存储和管理一系列相关的数据。数组可以通过使用下标来访问其的元素。下标是一个整数,用于标识数组特定元素的位置。例如,一个长度为5的数组包含5个元素,可以使用0到4的下标来访问这些元素。 如果开发者在代码使用了非数组对象,例如字符串或数字,进行下标操作,就会出现"Subscript on non-array"错误。因为这些非数组对象不支持下标操作。这个错误可以简单地通过检查代码的对象类型来避免。 另一种可能的情况是,开发者可能会尝试在数组使用超出其维数的索引。例如,如果一个数组的长度为5,使用大于4的索引,就会出现"too many dimensions"错误。这是因为数组只有一个维度,范围从0到长度-1。开发者应该检查代码的下标操作,并确保它们不会超出数组的范围。 在调试"Subscript on non-array or too many dimensions"错误时,开发者应该仔细检查数组的定义和访问,确保它们一致和正确。同时,开发者需要确认代码的变量类型和表达式是否正确,以避免尝试在非数组对象上执行下标操作。 ### 回答3: 在编程,我们常常会遇到 "subscript on non-array" 或 "too many dimensions" 的错误提示。这种错误通常是由于对非数组或维度过多的变量尝试进行下标访问所引起的。 在解决这种错误之前,我们需要理解什么是数组。数组是一种可以容纳多个元素的数据类型。每个元素都有一个唯一的索引(下标),索引从0开始逐渐增加。如果我们想要访问数组的某个元素,我们可以使用下标的方式来获取该元素。 但是,如果我们尝试对一个非数组的变量进行下标操作,程序就会抛出 "subscript on non-array" 的错误。这可能是因为我们在编写代码时没有正确地定义变量类型或者没有正确地初始化变量。 另外,如果我们在访问数组元素时使用了超出数组维度的下标,程序就会抛出 "too many dimensions" 的错误。这可能是因为我们在定义数组时指定了错误的数组大小,或者在使用数组时没有正确地计算出下标位置。 为了避免这两种错误,我们可以在编写代码之前仔细审查变量类型和数组维度,并确保使用合适的下标访问每个数组元素。如果不确定变量类型或数组维度,我们可以使用调试器或打印语句来诊断问题所在。 总之,正确地使用下标访问数组元素是我们编写高质量代码的必要技能,需要时刻注意不要出现类似 "subscript on non-array" 或 "too many dimensions" 的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值