`

Hibernate的<hibernate-mapping>中auto-import属性详解

 
阅读更多

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

auto-import是什么意思呢?

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

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

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

hibernate在处理这个HQL时,会先将其翻译成一条数据库能够识别的sql语句。翻译的依据当然是实体与数据库表之间的映射关系了。

现在我们就给他制造一些问题,我们让hibernate同时管理两个相同名称的实体:com.lft.model.User和com.lft.feng.model.User。

这时,我们再将上面那条HQL给hibernate解析,他还能顺利地将其翻译成一条sql语句吗?答案当然是否定的,他不知道你要查com.lft.model.User还是com.lft.feng.model.User。

所以,一条正确的HQL应该是这样的:

from com.lft.model.User u where u.name='aa';

但是,大多数时候,一个系统里不会出现同名的实体,如果要求所有HQL都这么写就不好了。所以hibernate提供一个auto-import属 性,当你不指定具体的实体时(只指定from User),他会自动找到唯一的名为User的实体映射,将其补全为com.lft.model.User。

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

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

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

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

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

 

当没有进行auto-import="false"设置时就会报出org.hibernate.DuplicateMappingException异常信息

这个异常是Hibernate在映射的时候抛出的,解决这个异常的方法有两种:

1. 直接的方法,就是把自己的类名字改一个名字。

2. 应用auto-import="false"设置每个映射文件

 

第二种解决方法的原理是:

在使用HibernateHQL查询语句的时候,如"select user from User user"

from后面的类名默认是自动引入的也就是<hibernate-mapping auto-import="true"> 的效果,所以改为false后就要写类的全名。


 

分享到:
评论

相关推荐

    hibernate-mapping参数详解

    ### Hibernate Mapping 参数详解 在 Hibernate 中,为了将 Java 对象映射到数据库表,并实现对象关系映射(ORM),开发者需要定义一系列配置属性来指导 Hibernate 如何进行转换。本文将详细解析 `hibernate-mapping...

    SSHA环境的搭建.doc

    同样地,需要在项目的`/WEB-INF/lib`目录下添加Hibernate相关的jar包,并在Spring的核心配置文件中配置Hibernate的相关属性。 ##### 5. 添加Struts 1.2支持 Struts是一个基于MVC模式的框架,用于实现视图层的展示...

    Spring+Struts2+Hibernate项目整合步骤

    &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;property name="annotatedClasses"&gt; &lt;list&gt; &lt;value&gt;com.example.model.User&lt;/value&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;/beans&gt; ``` ...

    ssh2+cxf搭建webservice实例

    &lt;servlet-mapping&gt; &lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ... &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context....

    jersey+spring+hibernate配置

    ### Jersey+Spring+Hibernate配置详解 #### 一、编写目的 本文档旨在详细介绍如何通过Spring、Hibernate和Jersey这三个框架来构建一个RESTful Web服务。文章不仅覆盖了基础的环境配置,还包括了如何搭建框架、配置...

    ajax配置模版

    &lt;import resource="register.xml"/&gt; &lt;bean id="propertyConfiguer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; &lt;property name="location" value="WEB-INF/db....

    struts2.0 hibernate3 spring2.5整合配置.doc

    &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;/beans&gt; ``` #### 三、Jar包导入 在SSH整合的过程中,正确的导入Jar包至关重要。以下是一些常用的Jar包列表: - **Struts2...

    Struts2的配置

    &lt;exception-mapping exception="java.lang.Exception" result="error"/&gt; &lt;/global-exception-mappings&gt; &lt;action name="Login" class="action.LoginAction"&gt; &lt;result&gt;/loginResult.jsp&lt;/result&gt; &lt;result name=...

    hibernate配置步骤文档

    **Hibernate配置步骤详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本教程将详细讲解Hibernate的配置步骤,帮助开发者快速上手。 1. **环境准备** 在开始配置...

    Spring MVC实例

    &lt;/servlet-mapping&gt; ``` 2. **定义 Controller**:在 `src/main/java` 目录下创建 Controller 类,处理 HTTP 请求。例如,一个简单的 "Hello, World!" 控制器可能如下所示: ```java import org.springframework....

    hibernate配置示例

    &lt;/hibernate-mapping&gt; ``` 映射文件中,`&lt;class&gt;`标签指定了实体类名和对应的数据库表,`&lt;id&gt;`和`&lt;property&gt;`标签分别对应主键和普通字段。 ### 3. SessionFactory与Session 在应用启动时,我们需要通过`...

    Hibernate+IDEA 2018 一个hibernate程序

    &lt;property name="hibernate.hbm2ddl.auto"&gt;update&lt;/property&gt; &lt;!-- 是否显示SQL语句 --&gt; &lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt; &lt;!-- SQL格式化 --&gt; &lt;property name="hibernate.format_sql"&gt;...

    Jbuilder里配置Hibernate

    private static final ThreadLocal&lt;Session&gt; threadLocal = new ThreadLocal&lt;&gt;(); private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory ...

    ssh集成步骤

    &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt; &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- Struts2 Action Bean --&gt; &lt;bean id="userAction" ...

    02-hibernate-A_Simple_Example

    ### 知识点详解:简单Hibernate示例解析 #### 一、概述 本文将通过一个简单的Hibernate示例来深入理解Hibernate的基本用法及其在实际项目中的应用。此示例来源于`coreservlets.com`提供的教程材料,具体详情可访问...

    关于乱码问题简单分析

    Tomcat服务器可以通过修改`server.xml`文件来调整处理HTTP请求的字符集,具体做法是在`&lt;Connector&gt;`标签中加入`URIEncoding`属性: ```xml &lt;Connector debug="0" acceptCount="100" connectionTimeout="20000" ...

Global site tag (gtag.js) - Google Analytics