`
aasonwu
  • 浏览: 35236 次
  • 性别: 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 一对一关联映射(主键关联VS唯一外键关联)

    总结,主键关联和唯一外键关联都是Hibernate实现一对一映射的有效方式,各有优缺点。开发者应根据具体业务需求和数据模型,选择合适的关联策略。理解并熟练运用这些关联映射,对于提升Java后端开发的效率和代码质量...

    hibernate使用主键关联的一对一关系

    在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    hibernate一对一主键关联映射(单项关联)

    以上就是关于Hibernate中一对一主键关联映射(单项关联)的详细解释。通过这种方式,我们可以有效地管理两个实体之间的一对一关系,提高数据模型的灵活性和完整性。在实际开发中,要根据具体业务需求选择合适的关联...

    Hibernate Annotation 共享主键一对一双向关联

    `Person`类中的`profile`属性使用了`mappedBy`属性,表明`Profile`是被关联方,`Profile`类中的`person`属性则使用了`@OneToOne`和`@PrimaryKeyJoinColumn`注解,表示`Person`是关联方,且主键和外键是同一个字段。...

    Java的Hibernate框架中的双向主键关联与双向外键关联

    这里主要讨论的是双向主键关联和双向外键关联。 **双向主键关联** 双向主键关联实际上是一种特殊的一对一关联,其中两个实体类的主键相互引用,形成一个闭环。在这种关联中,Person类和IdCard类具有相同的主键,即...

    hibernate一对一之唯一外键关联(双向关联)

    - 在一对一关联中,唯一外键关联是指在一个实体中定义了另一个实体的主键作为其字段,形成外键约束,确保了数据的一致性和完整性。 3. **双向关联与单向关联** - **单向关联**:只有一方知道另一方的存在,例如...

    Hibernate一对一唯一外键关联映射(双向关联)

    在数据库设计中,这种关系通常通过主键和外键的方式实现,其中一方的主键作为另一方的外键,确保了两表间的一对一关系。 二、唯一外键关联映射 在Hibernate中,一对一关联可以通过配置XML映射文件或使用注解来实现...

    hibernate中的 一对一唯一外键双向关联

    1. **通过主键关联(Primary Key Join)**:这种关联方式下,一方的主键同时也是另一方的外键。这种方式通常用于当两个表有共享主键的情况。 2. **通过唯一外键关联(ForeignKey Join)**:在这种情况下,一方表中...

    Hibernate一对一唯一外键关联映射(单向关联)

    一对一关联分为两种类型:共享主键关联(Primary Key Join)和唯一外键关联(Unique Foreign Key Join)。在本例中,我们讨论的是后者,即通过一个独立的外键字段在两个表之间建立一对一的关系。 ### 2. 唯一外键...

    hibernate一对一唯一外键关联映射(单项关联)

    总结,Hibernate的一对一唯一外键关联映射主要涉及映射配置、Java代码、数据库设计以及对象的操作和查询。在实际开发中,我们需要根据业务需求选择合适的关联方式,并关注性能和数据完整性的优化。

    Hibernate学习要点_one2one 一对一主键双线关联

    在深入探讨Hibernate中的一对一(One-to-One)主键双线关联机制之前,我们首先需要理解几个核心概念:Hibernate框架、实体关系映射以及主键关联的基本原理。Hibernate是Java平台下的一款开源对象关系映射(ORM)框架...

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。

    hibernate一对一唯一外键关联映射(双向关联)

    实体类应定义正确的属性类型和注解,以便Hibernate能够正确识别和处理关联。 ### 5. 实例代码 假设我们有两个实体类:`Person`和`DriverLicense`,它们之间存在一对一唯一外键关联,且是双向的。 ```java @Entity ...

    hibernate一对一主键关联(注解版)

    Hibernate默认会在被引用的一方(在这里是Profile)创建外键,但如果需要在引用方(User)创建外键,可以通过`inverse`属性改变,但这通常不推荐,因为主键关联通常由主表(User)驱动。 7. **懒加载与即时加载**...

    Hibernate ORM - 一对一外键关联关系

    综上所述,"Hibernate ORM - 一对一外键关联关系"是一个关于如何在Hibernate中设置和管理一对一关系的专题,涉及源码配置、工具使用和性能优化等多个方面。通过阅读相关的博客文章和实践压缩包中的示例,开发者可以...

    Hibernate Annotation 基于外键的一对多双向关联

    理解源码层面的工作原理,我们可以查看Hibernate的`org.hibernate.event.spi.EventSource`和`org.hibernate.event.internal.ReplicateEvent`等类,这些类处理了实体的复制和关联处理。在实际操作中,我们需要了解`...

    hibernate一对一主键关联代码实现

    本教程将详细解释如何通过代码实现Hibernate的一对一主键关联。 首先,我们需要理解一对一关联的含义:在数据库中,如果一个表的记录只能与另一个表的唯一一条记录对应,这就构成了主键关联的一对一关系。例如,一...

Global site tag (gtag.js) - Google Analytics