`

Hibernate auto-import属性 解决有同名实体的时候

阅读更多

在hibernate的实体映射文件(.hbm.xml)里,hibernate-mapping中有一个auto-import属性,默认值为true。

auto-import是什么意思呢?

我们经常会写这样一个HQL语句:

from User u where u.name='abc';

绝大多数时候,这样写是不会发生问题的。

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。

当你的系统中确实要需要两个同名的实体时

当你的系统中确实要需要两个同名的实体时,我们需要做两件事:

  1. 将这两个同名的实体的映射文件都要设置为auto-import
  2. 所有关于这两个实体的HQL,都需要明确指定其全限定名(如org.mysoa.security.model.User)

有人要问了,只要你做了第二条就够了呀,只要你保证所有的HQL都写了全限定名,那么hibernate解析就不会出错,系统应该是可以运行的。

其实不然。hibernate怎么知道你所有的HQL都写了全限定名?事实上,hibernate在系统加载过程中,如果发现有两个同名的实体,但是有任何一个没有设置auto-import=false,他就会抛出异常并停止加载,他以这种方式来确保你的auto-import问题在系统加载时就暴露出来,而不是延迟到真正执行一个有问题的HQL时才抛出问题。

转自 http://casheen.iteye.com/blog/469140。 仅用以收藏,忘作者体谅。

分享到:
评论

相关推荐

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip

    《Eclipse中Hibernate插件深度解析》 在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Eclipse作为主流的Java集成开发环境,其丰富的插件生态使得开发效率得以提升。...

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605

    - **HQL/SQL编辑器**:提供对Hibernate查询语言(HQL)和标准SQL的语法高亮和自动完成,有助于编写准确无误的查询。 3. **插件安装与配置:** Hibernate Tools作为Eclipse的插件,其安装通常通过Eclipse的“软件...

    hibernate-commons-annotations-5.0.1.Final.jar

    在本文中,我们将深入探讨`hibernate-commons-annotations-5.0.1.Final.jar`的源码,了解其内部结构和主要功能。 一、元数据注解 HCA的核心在于提供了一系列的注解,如`@Entity`、`@Table`、`@Column`、`@Id`等,...

    hibernate many-to-many级联保存,级联更新,级联删除

    在Java的持久化框架Hibernate中,Many-to-Many关系是一种常见的数据库表之间的关联方式,它表示一个实体可以与多个其他实体进行关联,反之亦然。本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、...

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    `hibernate-jpa-2.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...

    HibernateTools-3.2.4.Beta1-R200810311334.zip

    1. **代码生成器**:能够自动生成基于Hibernate的实体类、DAO层和配置文件,减少了手动编写大量重复代码的工作量,提高了开发效率。 2. **逆向工程**:可以从现有的数据库中生成Hibernate映射文件和Java类,使已有的...

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate jar包程序文件

    hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...

    hibernate-release-5.0.7.Final的所有jar包

    在这个`hibernate-release-5.0.7.Final`版本中,包含了所有相关的jar包,为开发者提供了一个完整的Hibernate ORM解决方案。 在Java开发中,jar(Java Archive)包是Java类库的打包形式,它包含了一系列的类文件和...

    hibernate-mapping参数详解

    在深入探讨`hibernate-mapping`参数之前,我们先理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。`hibernate-mapping`是Hibernate配置...

    hibernate-core-5.0.11.Final.jar

    本文将重点探讨`hibernate-core-5.0.11.Final.jar`的核心源码,帮助读者深入理解其内部机制,并提供实用的应用指导。 一、Hibernate Core概述 Hibernate Core是Hibernate框架的基础部分,它包含了ORM的核心功能,...

    hibernate-release-5.3.2.Final

    2018年7月5日,Hibernate发布了其最新版本——5.3.2.Final,带来了诸多改进和新特性,为开发者提供了更为高效、稳定的持久化解决方案。 一、Hibernate ORM概述 Hibernate ORM(Object-Relational Mapping)是一种将...

    hibernate-extensions和Middlegen-Hibernate

    为了解决这一问题,两个工具——hibernate-extensions和Middlegen-Hibernate应运而生,它们可以自动生成这些代码,提高了开发效率。 **hibernate-extensions** 是Hibernate框架的一个扩展,它提供了一些额外的功能...

    hibernate-mapping-3.0.dtd

    hibernate-mapping-3.0.dtd 最新从官网下载,无损无修改

    Hibernate-extensions 完整安装包

    1. 延迟加载:Hibernate-Extensions支持更细粒度的延迟加载控制,例如属性级别的延迟加载,这在处理大数据量时尤其有用,可以显著减少内存消耗。 2. 实体监听器:通过实现EntityListener接口,开发者可以在特定的...

    hibernate 3.5.0-final core reference 中文pdf

    - **Hibernate-mapping**:解释了根元素`hibernate-mapping`的作用。 - **类**:说明了如何映射Java类到数据库表。 - **id**:解释了如何配置实体的主键。 - **增强的标识符生成器**:介绍了几种不同的标识符生成...

    hibernate--- jar包

    1. **配置Hibernate**: 首先,我们需要在项目中添加Hibernate的jar包,这可能包括hibernate-core.jar、hibernate-entitymanager.jar、hibernate-validator.jar等。这些文件包含了Hibernate的核心API、实体管理器以及...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射是指两个实体之间的关联关系,其中一个实体作为外键,另一个实体作为关联目标。这种关联方式可以分为单向关联和双向关联两种。 单向关联是指一个实体作为外键,关联到另一个...

Global site tag (gtag.js) - Google Analytics