`
cats_tiger
  • 浏览: 276514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate 隐含关联(implicit joins)的变化

阅读更多
前一个关于这个问题的帖子被隐藏了,这次说明确些。
例如有两个类,员工TestEmployee 和部门TestDept,它们是ManyToOne关系:
@Entity
@Table(name = "test_employees", uniqueConstraints = { })
public class TestEmployee extends BaseModel implements Serializable {
  private Integer id;
  private TestDept dept;

  @Id
  @GeneratedValue(generator = "hilo")
  @GenericGenerator(name = "hilo", strategy = "hilo")
  @Column(name = "ID", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @ManyToOne(cascade = { }, fetch = FetchType.LAZY)
  @JoinColumn(name = "dept_id")
  public TestDept getDept() {
    return this.dept;
  }

  public void setDept(TestDept dept) {
    this.dept = dept;
  }
}
@Entity
@Table(name = "test_depts", uniqueConstraints = { })
public class TestDept extends BaseModel implements Serializable {
  
  private Integer id;
  private String name;
  private Set<TestEmployee> employees = new HashSet<TestEmployee>(0);

  @Id
  @GeneratedValue(generator = "hibseq")
  @GenericGenerator(name = "hibseq", strategy = "hilo")
  @Column(name = "ID", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }


  @Column(name = "name")
  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @OneToMany(cascade = { }, fetch = FetchType.LAZY, mappedBy = "dept")
  public Set<TestEmployee> getEmployees() {
    return this.employees;
  }

  public void setEmployees(Set<TestEmployee> employees) {
    this.employees = employees;
  }
}

现在我要查询员工A所在的部门,使用隐含关联:
getHibernateTemplate().find(
        "from TestDept d where d.employees.name = 'A'");

如果使用Hibernate3.2.3以后的版本,会出现一个异常illegal attempt to dereference collection。这个问题比较容易解决,只需要明确的关联上employees即可:
getHibernateTemplate().find(
        "from TestDept d inner join d.employees e where e.name = 'A'");

可是,如果使用Hibernate3.2.2,即使使用隐含关联也不会有问题。我的问题是:现在升级为Hibernate3.2.5,以前的代码怎么办?这是Hibernate的Bug吗?
从Hibnerate的Jira上终于得到了答案:
对于implicit joins,Hibernate3.2.2会自动生成inner join,这样,被关联对象如果为null,就不会查出任何结果。这使得隐含关联更具确定性(原文:This makes implicit joins more deterministic. )。
Hibernate3.2.2之后如果隐含关联的是一个Collection,那么Hibernate就会抛出那个异常。这会提醒用户,使用更加明确的关联。
终于弄清问题所在了,可是以前的代码都得改,JUnit测出了40多个Bugs,郁闷呀!

分享到:
评论
2 楼 cats_tiger 2007-12-05  
Readonly 写道
你给的代码:
getHibernateTemplate().find("from TestDept d where d.employees.name = 'A'");  

Hibernate从来没有说过HQL可以这样用,因为employees是TestDept对应的一个集合,集合没有name这个属性。
在3.1~3.2中某几个版本有bug,能够让你这样的查询能生效,如果你要升级,只能一个一个地修改了。

你昨天被隐藏帖子说的是类似这样的查询:
getHibernateTemplate().find("from TestEmployee e where e.testDept.name = 'B'");  

这样的HSQL是一直可以生效的,不会出现你说的问题。

是的,这个问题困扰我很久了,所以昨天又问了一次,还吧代码贴错了,惭愧。
1 楼 Readonly 2007-12-05  
你给的代码:
getHibernateTemplate().find("from TestDept d where d.employees.name = 'A'");  

Hibernate从来没有说过HQL可以这样用,因为employees是TestDept对应的一个集合,集合没有name这个属性。
在3.1~3.2中某几个版本有bug,能够让你这样的查询能生效,如果你要升级,只能一个一个地修改了。

你昨天被隐藏帖子说的是类似这样的查询:
getHibernateTemplate().find("from TestEmployee e where e.testDept.name = 'B'");  

这样的HSQL是一直可以生效的,不会出现你说的问题。

相关推荐

    hibernate关联映射的作用和常用属性解释

    ### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...

    Hibernate性能调优

    #### 一、理解Hibernate与关联管理 在Hibernate中,关联管理是性能优化的关键因素之一。关联通常包括以下几种类型:单向`one-to-many`关联、双向`one-to-many`关联、`many-to-one`关联以及`one-to-one`关联。 #####...

    Hibernate+中文文档

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载...

    hibernate3.2中文文档(chm格式)

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载...

    HibernateAPI中文版.chm

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载...

    C# 自定义 implicit和explicit转换 demo

    在C#编程语言中,`implicit`和`explicit`转换是两种用户自定义类型转换的方式。它们允许我们创建自己的类型转换规则,使不同类型的变量之间能够进行安全或强制的转换。下面将详细介绍这两种转换方式以及如何在实际...

    常用 Hibernate 映射配置说明.doc

    - **polymorphism**: 控制继承模式,可以是`implicit`(隐式继承)或`explicit`(显式继承)。 - **where**: 允许添加额外的WHERE条件到SQL语句中。 - **persister**: 自定义持久化策略,可以通过实现`org....

    Implicit mixtures of Conditional Restricted Boltzmann Machines

    隐含混合条件受限玻尔兹曼机(Implicit Mixtures of Conditional Restricted Boltzmann Machines, 简称imCRBM)是一种先进的深度学习模型,主要用于处理实值数据(real-value data)。在传统机器学习中,受限...

    Hibernate中文详细学习文档

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载...

    Hibernate 中文 html 帮助文档

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 ...

    Level Set Methods and Dynamic Implicit Surfaces

    Level Set Methods(水平集方法)和Dynamic Implicit Surfaces(动态隐式曲面)是计算几何中的重要概念,广泛应用于图像处理、计算物理等领域。Level Set Methods由Stanley Osher和Ronald Fedkiw等人提出,并在Osher...

    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 参考文档

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 ...

    Hibernate教程

    10.1.6. Table per concrete class, using implicit polymorphism 10.1.7. 隐式多态和其他继承映射混合使用 10.2. 限制 11. 与对象共事 11.1. Hibernate对象状态(object states) 11.2. 使对象持久化 11.3. 装载...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载...

    Python-Implicit用于隐式数据集的快速Python协同过滤

    在Python的推荐系统领域,`Implicit`库是一个非常重要的工具,尤其对于处理隐式反馈数据集,如用户浏览记录、点击行为等。隐式反馈数据集的特点是它们并不直接表示用户的喜好,而是通过用户的行为间接推断。例如,...

    Hibernate继承关系映射.pdf

    本文档主要聚焦于Hibernate框架下继承关系的映射,通过三种不同的策略——隐式继承映射、单表映射和关联表映射,来实现类的继承结构在数据库中的映射。 ### 隐式继承映射 #### 定义与配置 隐式继承映射也称为“表...

    implicitIntents:隐含意图

    隐含意图(Implicit Intents)是Android开发中的一个重要概念,它是Android系统中组件间通信的一种方式,主要用于在没有明确指定接收方的情况下启动其他应用程序组件。通过隐含意图,开发者可以利用系统或者其他应用...

    c#问题 谁能解释下public static implicit operator float

    在给定的信息中,主要涉及的是`public static implicit operator float(currency value)`这一概念的理解。下面将详细解释这个表达式中每个部分的意义,以及它如何在C#中工作。 ### `public` 在C#中,`public` 是一...

Global site tag (gtag.js) - Google Analytics