`

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-mapping

    hibernate关系映射配置.rar

    &lt;hibernate-mapping&gt; &lt;class name="com.bjsxt.hibernate.User" table="t_user"&gt; &lt;id name="id"&gt; &lt;generator class="native"/&gt; &lt;/id&gt; &lt;property name="name"/&gt; &lt;!-- &lt;many-to-one name="group" column...

    解决struts2.1.6+spring+hibernate 中文乱码

    struts.properties设置( struts.objectFactory = spring struts.i18n.reload=true ...struts.i18n.encoding=GBK ) web.xml(仅写出中文处理部分,spring的配置不用改变) &lt;filter&gt; ... &lt;/filter-mapping&gt;

    hibernate配置

    &lt;property name="数据库中表的其它字段所对应的持久化对象中的属性名" column="对应数据库中表的其它字段名" type="java.lang.String(数据库中其它字段的数据类型)"/&gt; &lt;/class&gt; &lt;/hibernate-mapping&gt; 三.配置...

    java三大框架注解配置

    &lt;filter-mapping&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;url-pattern&gt;*.action&lt;/url-pattern&gt; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt; &lt;/filter-mapping&gt; 2、添加hibernate功能 3、添加Spring功能

    防止多用户登录同一帐号

    web.xml添加filter: &lt;filter&gt; &lt;filter-name&gt;SingleFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.com.filter.SingleFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;... &lt;/filter-mapping&gt;

    jsp 注册<servlet>方法说明

    &lt;servlet&gt; &lt;servlet-name&gt;HelloWorldname&lt;/servlet-name&gt; &lt;!-- 此说明该&lt;servlet/&gt; 已经得到了注册名HelloWorldname, ... 它与&lt;servlet-mapping/&gt;必须注册同样的注册名 --&gt; ...&lt;/servlet-mapping&gt;

    jaxrs-api,javax.ws.rs.Path;

    &lt;param-name&gt;resteasy.servlet.mapping.prefix&lt;/param-name&gt; &lt;param-value&gt;/app/service&lt;/param-value&gt; &lt;/context-param&gt; &lt;!--接口管理--&gt; &lt;context-param&gt; &lt;param-name&gt;resteasy.resources&lt;/param-name&gt; ...

    简单配置 shiro + spring +springMVC+hibernate简单框架

    &lt;filter-mapping&gt; &lt;filter-name&gt;shiroFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; maven 的pom.xml 配置 &lt;!-- shiro简单配置 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache....

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    &lt;/filter-mapping&gt; &lt;!-- Spring view分发器 --&gt; &lt;servlet&gt; &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; ...

    cas 配置client 1.0 &2.0 及proxy DEMO 说明

    &lt;/filter-mapping&gt; &lt;welcome-file-list&gt; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; &lt;/welcome-file-list&gt; &lt;/web-app&gt; 4 cas client 2.0配置说明 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app version=...

    xfire的使用详解

    重点位置: &lt;!-- spring 配置文件--&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath:spring/app.xml,classpath:org/codehaus/xfire/spring/... &lt;/servlet-mapping&gt;

    WMS仓库管理系统SSM.zip

    (写在前面的话,评论中说的图片显示问题解决了,原因是文件被拦截了,感谢帮忙解决问题的同学!) 基于SSM(spring+springMVC+MyBatis)技术开发的仓库管理系统,是我这学期期末综合课设项目,新鲜...&lt;/servlet-mapping&gt;

    SpringStrutsHibernate的配置

    <servlet-mapping> <servlet-name>③HelloWorld</servlet-name> <url-pattern>④/ helloworld</url-pattern> 这里的”/ ”必须带!!!! </servlet-mapping> &lt;welcome-file-list&gt; &lt;welcome-file&gt;...

    基于SSM(spring+springMVC+MyBatis)开发的仓库管理系统

    (写在前面的话,评论中说的图片显示问题解决了,原因是文件被拦截了,感谢帮忙解决问题的同学!) 基于SSM(spring+springMVC+MyBatis)技术开发的仓库管理系统,是我这学期期末综合课设项目,新鲜... &lt;/servlet-mapping&gt;

    AjaxAnyWhere中文帮助文档.pdf

    &lt;filter-mapping&gt; &lt;filter-name&gt;AjaxAnywhere&lt;/filter-name&gt; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;AjaxAnywhere&lt;/filter-name&gt; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; &lt...

    简单易用的gizp包,tk-filters.jar

    简单易用的gzip包,工程中引入tk-filters.jar,然后在web.xml做如下配置,即可使用。 &lt;!-- GZIPFilter Definition --&gt; &lt;filter&gt; &lt;filter-name&gt;GZIPFilter&lt;/filter-name&gt; ... &lt;/filter-mapping&gt;

    web.xml详细说明

    用于 web.xml 配置详解。例如: &lt;web-app&gt; &lt;display-name&gt;&lt;/display-name&gt;定义了...&lt;filter-mapping&gt;&lt;/filter-mapping&gt; 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。

    dwr源码包,dwr.jar包下载

    1、 导入dwr.jar包 2、 在web.xml中配置dwr,如下: &lt;!-- 配置DWR --&gt; &lt;servlet&gt; &lt;servlet-name&gt;dwr-... &lt;servlet-mapping&gt; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;

Global site tag (gtag.js) - Google Analytics