在hibernate的实体映射文件(.hbm.xml)里,hibernate-mapping中有一个auto-import属性,默认值为true。
|
auto-import是什么意思呢?
我们经常会写这样一个HQL语句:
from User u where u.name='罗灿锋';
绝大多数时候,这样写是不会发生问题的。
hibernate在处理这个HQL时,会先将其翻译成一条数据库能够识别的sql语句。翻译的依据当然是实体与数据库表之间的映射关系了。
现在我们就给他制造一些问题,我们让hibernate同时管理两个相同名称的实体:org.mysoa.security.model.User和com.kedacom.ksoa.security.model.User。
这时,我们再将上面那条HQL给hibernate解析,他还能顺利地将其翻译成一条sql语句吗?答案当然是否定的,他不知道你要查 org.mysoa.security.model.User还是com.kedacom.ksoa.security.model.User。
所以,一条正确的HQL应该是这样的:
from org.mysoa.security.model.User u where u.name='罗灿锋';
但是,大多数时候,一个系统里不会出现同名的实体,如果要求所有HQL都这么写就不好了。所以hibernate提供一个auto-import属性,当你不指定具体的实体时(只指定from User),他会自动找到唯一的名为User的实体映射,将其补全为org.mysoa.security.model.User。
|
|
当你的系统中确实要需要两个同名的实体时
当你的系统中确实要需要两个同名的实体时,我们需要做两件事:
- 将这两个同名的实体的映射文件都要设置为auto-import
- 所有关于这两个实体的HQL,都需要明确指定其全限定名(如org.mysoa.security.model.User)
有人要问了,只要你做了第二条就够了呀,只要你保证所有的HQL都写了全限定名,那么hibernate解析就不会出错,系统应该是可以运行的。
其实不然。hibernate怎么知道你所有的HQL都写了全限定名?事实上,hibernate在系统加载过程中,如果发现有两个同名的实体,但是有任何一个没有设置auto-import=false,他就会抛出异常并停止加载,他以这种方式来确保你的auto-import问题在系统加载时就暴露出来,而不是延迟到真正执行一个有问题的HQL时才抛出问题。
|
转自 http://casheen.iteye.com/blog/469140。 仅用以收藏,忘作者体谅。
分享到:
相关推荐
3. `auto-import`:默认为`true`,允许在HQL查询中使用非全限定类名。如果设置为`false`,需要在查询中使用完全限定的类名,以防止类名冲突。 4. `cascade`:级联操作是Hibernate中的一个重要特性,用于管理对象...
接着,`<hibernate-mapping>`元素是映射文件的根元素,它可以包含多个配置属性,如`schema`、`default-cascade`、`auto-import`和`package`,分别用于指定数据库模式、默认级联行为、是否自动导入类以及Java类的包名...
`schema`定义了表所在的数据库模式,`default-cascade`设置了默认的级联行为,`auto-import`允许在查询中使用非限定类名,默认为`true`,`package`指定类的包名前缀。 2. `default-access`属性:定义了Hibernate...
当`auto-import`为`true`时,此属性尤其重要,因为它帮助Hibernate解析类名。 #### 2. Class节点定义 `class`节点是映射文件中定义具体实体类的地方,它将Java类与数据库表关联起来。 - **name**: 映射的Java类的...
### Hibernate配置文件详解 在Java开发环境中,Hibernate作为一款优秀的对象关系映射(Object-Relational Mapping,简称ORM)框架,极大地简化了数据库操作过程。本文将深入探讨Hibernate配置文件的相关知识点,...
3. `auto-import`:当设置为`true`时,允许在查询中使用非全限定的类名。 4. `package`:指定持久化类的Java包前缀。 接下来,我们关注`class`元素,它是用于定义一个持久化类的。`class`元素的`name`属性表示类的...
- `auto-import`: 设置是否允许在查询语言中使用非全限定类名,默认值为`true`。 - `package`: 指定一个包前缀,对于映射文件中未指定全限定类名的,将默认使用该包前缀。 - **`<class/>`元素详解** - `table`:...
### Tomcat下配置Hibernate知识点详解 #### 一、前言 在Java Web开发中,Tomcat作为一款轻量级的应用服务器被广泛使用。而在实际项目中,为了更好地管理数据库连接和进行对象关系映射(ORM),Hibernate框架因其...
### Hibernate+IDEA 2018 构建Hibernate程序详解 #### 环境配置与准备工作 在开始构建一个Hibernate程序之前,首先要确保环境配置正确。以下为本项目的环境需求: - **操作系统**:Windows 10, 版本 1703。 - **...
### myEclipse 使用 Hibernate 图解知识点详解 #### 一、集成 Hibernate 类库到 MyEclipse 项目 在 MyEclipse 中使用 Hibernate 开发时,首先需要将 Hibernate 的类库加入到项目中。具体步骤如下: 1. **添加 ...
**Hibernate配置示例详解** Hibernate,作为Java领域中的一款强大且流行的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式处理数据,从而避免了传统JDBC中的繁琐代码。本示例将...
import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; public class HibernateSessionFactory { private static String CONFIG_FILE_LOCATION = "/...
### Hibernate简单实例详解 #### 一、概述 Hibernate是一个开源的对象关系映射(Object Relational Mapping,ORM)框架,用于简化Java应用与数据库之间的交互。本文将通过一个简单的实例来介绍如何使用Hibernate...
《Spring Data JPA结合Hibernate实现客户域模型详解》 在Java开发中,Spring Data JPA与Hibernate的结合使用,极大地简化了数据访问层的操作,提高了开发效率。本篇将深入探讨如何利用Spring Data JPA与Hibernate...
总的来说,Hibernate的映射配置涉及了实体类与数据库表之间的关系映射,包括类名与表名、属性名与列名、主键生成策略等。通过XML映射文件或注解的方式,我们可以方便地管理对象与数据间的转换,实现ORM(对象关系...
### JSF + Hibernate + Spring 集成案例详解 #### 一、项目概述与环境搭建 本案例旨在通过集成JSF、Spring 和 Hibernate 框架来构建一个具备登录、浏览、注册、修改、删除及退出功能的Web应用。通过这个示例,我们...