前一个关于这个问题的帖子被隐藏了,这次说明确些。
例如有两个类,员工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,郁闷呀!
分享到:
相关推荐
### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...
#### 一、理解Hibernate与关联管理 在Hibernate中,关联管理是性能优化的关键因素之一。关联通常包括以下几种类型:单向`one-to-many`关联、双向`one-to-many`关联、`many-to-one`关联以及`one-to-one`关联。 #####...
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. 装载...
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. 装载...
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`转换是两种用户自定义类型转换的方式。它们允许我们创建自己的类型转换规则,使不同类型的变量之间能够进行安全或强制的转换。下面将详细介绍这两种转换方式以及如何在实际...
- **polymorphism**: 控制继承模式,可以是`implicit`(隐式继承)或`explicit`(显式继承)。 - **where**: 允许添加额外的WHERE条件到SQL语句中。 - **persister**: 自定义持久化策略,可以通过实现`org....
隐含混合条件受限玻尔兹曼机(Implicit Mixtures of Conditional Restricted Boltzmann Machines, 简称imCRBM)是一种先进的深度学习模型,主要用于处理实值数据(real-value data)。在传统机器学习中,受限...
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. 装载...
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(水平集方法)和Dynamic Implicit Surfaces(动态隐式曲面)是计算几何中的重要概念,广泛应用于图像处理、计算物理等领域。Level Set Methods由Stanley Osher和Ronald Fedkiw等人提出,并在Osher...
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. 第...
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. 装载对象 ...
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. 装载...
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`库是一个非常重要的工具,尤其对于处理隐式反馈数据集,如用户浏览记录、点击行为等。隐式反馈数据集的特点是它们并不直接表示用户的喜好,而是通过用户的行为间接推断。例如,...
本文档主要聚焦于Hibernate框架下继承关系的映射,通过三种不同的策略——隐式继承映射、单表映射和关联表映射,来实现类的继承结构在数据库中的映射。 ### 隐式继承映射 #### 定义与配置 隐式继承映射也称为“表...
隐含意图(Implicit Intents)是Android开发中的一个重要概念,它是Android系统中组件间通信的一种方式,主要用于在没有明确指定接收方的情况下启动其他应用程序组件。通过隐含意图,开发者可以利用系统或者其他应用...
在给定的信息中,主要涉及的是`public static implicit operator float(currency value)`这一概念的理解。下面将详细解释这个表达式中每个部分的意义,以及它如何在C#中工作。 ### `public` 在C#中,`public` 是一...