Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432949
  • 博文数量: 138
  • 博客积分: 4114
  • 博客等级: 上校
  • 技术积分: 1341
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-14 20:41
文章分类

全部博文(138)

文章存档

2014年(1)

2013年(2)

2012年(78)

2011年(13)

2010年(34)

2009年(10)

我的朋友

分类: Java

2012-12-26 11:14:29

本文转自

http://blog.csdn.net/thinkner/article/details/5280642

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。

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

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

  1. 将这两个同名的实体的映射文件都要设置为auto-import="false"
  2. 所有关于这两个实体的HQL,都需要明确指定其全限定名(如org.mysoa.security.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"设置每天映射文件

阅读(826) | 评论(0) | 转发(0) |
0

上一篇:小记 jquery children用法

下一篇:js 小技巧

给主人留下些什么吧!~~