`
aasonwu
  • 浏览: 34579 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于Hibernate 重复获取主键和关联类的外键的疑问

阅读更多

假定Customer类和Order类之间为双向一对多关联关系.

Customer类包含的属性:


	/**对象OID*/
	private Long id;
	/**Customer对象的姓名*/
	private String name;
	/**Customer对象的年龄*/
	private int age;
	/**与Customer对象的订单*/
	private Set<Order> orders=new HashSet<Order>();

hibernate映射文件:

	<class name="Customer" table="customers">
		<id name="id" type="long" column="id">
			<generator class="native" />
		</id>

		<property name="name" type="string" column="name" />

		<property name="age" type="int" column="age" />

		<set name="orders" cascade="all" inverse="true" lazy="true">
			<key column="customer_id" />
			<one-to-many class="Order" />
		</set>
		
	</class>

Order类包含的属性:

	/**对象OID*/
	private Long id;
	/**Order 对象的订单号*/
	private String orderNumber;
	/**Order 对象的订单价格*/
	private double price;
	/**与Order 对象关联的Customer对象*/
	private Customer customer;

hibernate映射文件:

   <class name="Order" table="orders">
     
      <id name="id" type="long" column="id">
        <generator class="native"/>
      </id>
   
      <property name="orderNumber" type="string"  column="orderNumber" length="15" />
      
      <property name="price"  type="double"  column="price"  />

      <many-to-one name="customer" column="customer_id" class="Customer" />

    </class>

假设数据库中存在的数据为:

cusomters表

orders表:

以下为测试代码:


		List result=session.createQuery("select c from Customer as c inner  join  c.orders  where c.name like 'T%'")
									.list();
		Iterator it = result.iterator();
		Customer customer=(Customer) it.next();
		System.out.println(customer.getOrders().size());

Hibernate生成对应的SQL语句为:

Hibernate: 
    select
        customer0_.id as id4_,
        customer0_.name as name4_,
        customer0_.age as age4_ 
    from
        customers customer0_ 
    inner join
        orders orders1_ 
            on customer0_.id=orders1_.customer_id 
    where
        customer0_.name like 'T%'
Hibernate: 
    select
        orders0_.customer_id as customer4_4_1_,//重复字段
        orders0_.id as id1_,//重复字段
        orders0_.id as id5_0_,
        orders0_.orderNumber as orderNum2_5_0_,
        orders0_.price as price5_0_,
        orders0_.customer_id as customer4_5_0_ 
    from
        orders orders0_ 
    where
        orders0_.customer_id=?

疑问:

上述sql语句中,注释重复字段与下面的字段重复了,为什么要重复检索orders的主键id和外键customer_id字段

另:

上述采用内链接方式检索,但其实做外连接,迫切做外连接,单表查询也会重复检索主键和外键字段


分享到:
评论

相关推荐

    Hibernate注解

    * 13.sequence-identity sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本 * 例:@GeneratedValue(generator = "paymentableGenerator") * @GenericGenerator(name = ...

    hibernate学习笔记

    hibernate一对一主键关联映射(单向关联Person----&gt;IdCard) 8 hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射(单向关联Person----&gt;IdCard) 10 hibernate一对一...

    Hibernate_Annotation关联映射

    和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了...07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。

    传智播客李勇hibernate源码1-20课

    传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;... 18_一对一主键关联关系的映射与原理分析 19_一对一主键关联关系的检索 20_一对一外键关联关系的映射与原理分析

    Hibernate Annotations 中文文档

    2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4...

    Hibernate实战(第2版 中文高清版)

     7.1.1 共享的主键关联   7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把列添加到联结表   7.2.4 映射map   7.3 多态关联...

    Hibernate注释大全收藏

    以上所有实体使用 JOINED 策略 Ferry和Boat class使用同名的主键关联(eg: Boat.id = Ferry.id), AmericaCupClass 和 Boat 关联的条件为 Boat.id = AmericaCupClass.BOAT_ID. 从父类继承的属性 @MappedSuperclass ...

    hibernate annotation 中文文档

    2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4.3.1. ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

    Java代码生成工具新版

    支持自增主键,复合主键,外键关联。 生成Hibernate POJO类,Dao类,Service类,Action类。 生成保存,删除,修改,批量保存,批量修改,批量删除,按条件查询,分页查询等功能。 生成各大主流框架配置文件及JSP页面...

    Hibernate使用技巧汇总

    property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名 单向一对多需在一方配置,双向一对多需在双方进行配置 8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控...

    hibernate annotation帮助文档

    2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4...

    jdbc基础和参考

    delete-orphan:解除关联关系时,删除和当前对象失去关联的对象 all-delete-orphan:all+delete-orphan 单向的一对多的关系,在进行关联关系的操作时,会执行不必要的update语句,所以,一般情况下,我们不会做单向一...

    Hibernate 中文 html 帮助文档

    16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.4.1. 别名和属性引用(Alias and property references) 16.1.5. 返回非受管实体...

    Java代码生成工具(傻瓜式操作无需教程的代码生成工具) v2.0.zip

    支持自增主键,复合主键,外键关联。  生成hibernate pojo类,dao类,service类,action类。  生成保存,删除,修改,批量保存,批量修改,批量删除,按条件查询,分页查询等功能。  生成各大主流框架配置文件...

    最全Hibernate 参考文档

    9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

Global site tag (gtag.js) - Google Analytics