Hibernate的auto-import属性详解

简介: auto-import是什么意思呢? 我们经常会写这样一个HQL语句:from User u where u.name='罗灿锋';绝大多数时候,这样写是不会发生问题的。hibernate在处理这个HQL时,会先将其翻译成一条数据库能够识别的sql语句。

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
    2. 所有关于这两个实体的HQL,都需要明确指定其全限定名(如org.mysoa.security.model.User)

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

目录
相关文章
|
SQL Java 数据库连接
Hibernate【inverse和cascade属性】知识要点
Hibernate【inverse和cascade属性】知识要点
148 0
Hibernate【inverse和cascade属性】知识要点
|
缓存 Java 数据库连接
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
120 0
Hibernate一对多关联的两个关键属性cascade和inverse(十一)
|
Java 数据库连接 数据库
spring-boot工程中,jpa下hibernate的ddl-auto的各种属性
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80871845 jpa...
1087 0
|
Java 数据库连接 数据库
|
Java 数据库连接 容器
|
Java 数据库连接
hibernate CascadeType属性
CascadeType.PERSIST 只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态) ;              级联保存,当调用了Persist() 方法,会级联保存相应的数据 CascadeType.MERGE指A类新增或者变化,会级联B对象(新增或者变化) CascadeType.REMOVE只有A类删除时,会级联删除B类; CascadeType.ALL包含所有; CascadeType.REFRESH没用过。
791 0
|
SQL Java 数据库连接
|
Java 数据库连接 数据库
Hibernate Cascade 属性
1.在一对多的 set配置中 , inverse="true" 表示 反转,即由多方来控制。 2.在一对多的 set配置中, cascade="all" 表示 级联操作。 即 一方保存数据,会将所关联的多方的数据同时保存到数据库中。
|
Java 数据库连接
Hibernate Inverse属性
inverse属性: 在one方的一对多关联中设置inverse属性为true,则表示由多方来维护关联关系,这有助于性能的改善; 不设置该属性的话双方都会维护关联关系 eg: 响性能。