Hibernate (JAVA)面试题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
</Context>
3、jdbc测试代码
Context initCtx = new InitialContext();
//进入连接池环境
Context envCtx = (Context)initCtx.lookup("java:comp/env");
//得到一个连接池
ds = (DataSource)envCtx.lookup("jdbc/sa");
<property name="show_sql">true</property>
<!--是否显示sql-->
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<!--hibernate的驱动管理器-->
系统运行效率快。
悲观锁:一个游标读取一批数据后加锁,另一个事务不可以更新游标中的数据,但游标所在事务的更新一定成功。
系统运行效率慢。
3、可重复读:将上一个sql取的数据临时存储,保证同一个事务内下一个sql与上一个sql取的数据一样。
4、串行化:一个事对表进行select、update、delete、insert时全表加锁,另一个事只可以select不可update、delete、insert。运行速度最慢。
inverse=false是主控方,外键是由它控制的
inverse=true是被控方,外键与它没关系
cascade:级联,要想实现级联必须将从对象作为主对象的属性。
主表增从表增
主表修从表修
主表删从表删
lazy:延迟
lazy=false:不但取当前对象,还取其关联的所有内容
lazy=true:只取当前对象不取关联对象的属性,当真正用到对方属性时才执行sql加载相应的值
十九、简述数据查找的过程?
首先在一级缓存中中找,若没有找到就在二级缓存中,若还是没有找到就产生sql在数据据库中找。
二十、简述缓存的特点?
load、get、insert、update、delete都会自动同步缓存,但query.executeUpdate()不更缓存,但如果批量更新时exeucuteUpdate执行效率很高。
trans.rollback();
Query:执行查询Байду номын сангаас
//hql,类及属性是对象
Query query=session.createQuery("from Customer where customerid=:aa")
query.setString("aa","aa")
List list=query.list();
游离(detached)
被session抛弃
十二、简述没有锁会存在的问题?
1、脏读:一个事务处理的数据是另一个事务没有提交的数据
2、覆盖更新:一个事务将另一个事务的修改覆盖了。
3、不可重复读:一个事务两个相同的sql读取出来的内容不一样。
4、幻想读:同一个事务第一次读有,第二次读没有。
十三、简述锁的分类?
Validator:在做之前进行拦截,在处理之前进行校验
Lifecycle:拦截器,可以增加、修改、查询等之前触发,但其让数据类与hibernate的藕合度增加,一般不用。
public class Users implements Validator,Lifecycle
{
}
interceptor:拦截器,其比Lifecycle更加的优秀,不用每个数据类去实现一些接口,而是在产生session时将其注入到session中。其可以增加、修改、查询等之前触发,但其中的session不可以重用,可以用上一个session的connection,不用管事务,因为事务已被前一个session实现。
四、简述关联组成及作用?
one-to-many:
get/set方法:
一方通过get方法可以取出另一方,另一方也可以通过get方法取出对方,所以在one这边有一个Set属性可以得到所有的many,many这边有一个One类型的属性可以取出one
inverse:主控方,维护外键值,说明外键列由谁来控制,要想维护外键列的值必须将被控方作为主控方的属性,主控方一般在many方。
H
一、简述Hibernate作用?
O/R Mapping(对象关系映射)
将工作量降低95%
二、简述核心配置文件及作用?
hibernate.cfg.xml:数据库的连接、批量处理、加载二级缓存驱动、显示sql
*.hbm.xml:将一个表与类相映射、二级缓存的方式
三、简述核心接口、类组成及作用?
类:
Configuration:读取hibernate.cfg.xml及*..hbm.xml文件
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
</ehcache>
3、在hibernate.cfg.xml中加入两个属性
a、说明提供二级缓存驱动类
b、说明query也支持缓存
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
接口:
SessionFactory:产生具体的session
Session:做具体的操作
save
update
saveOrUpdate:有主键修改,没主键增加
delete
load
Transaction:事务处理
Transaction trans=session.beginTransaction();
trans.commit();
十五、简述利用缓存的原则?
1、数据量在可接收的范围内
2、更新或并发更新少
3、重复查询且使用率高的数据
十六、简述缓存的实现步骤?
1、hibernate提供了支持缓存的接口,通过修改hibernate.cfg.xml设置缓存。
2、将ehcache.jar拷入工程
3、要src的根目录下加入ehcache.xml说明缓存。
<mapping resource="com/accp/t15/Customer.hbm.xml"/>
</session-factory>
5、spring调用tomcat中的连接池
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
3、sequence:oracle的序列
4、native:自动选择identity、sequence,不用手动给定
5、uuid.hex:Hibernate基于128位唯一值产生算法生成16进制数值
八、简述数据库开发的过程?
外模型
以客户为中心,客户可以看懂。
概念模型
以外模型作为输入,适应开发的进一步细化,是外模型全集
1、读未提交:可以读取未提交的数据,不可以防止脏读、覆盖更新。
2、读已提交(数据库默认的处理方式):读取的数据是已提交的,在提交之前当前行的版本与数据库的版本比较,若小于数据库的版本报错回退。
乐观锁:一个游标读取一批数据后不加锁,另一个事务可以更新游标中的数据,但游标所在事务更新另一事务更新过的行时,报错,回退。
十七、简述list使用缓存的特点?
sql只执行一次,直接查询o/r mapping后返回结果,要想重用缓存,hql必须相同,如果相同,相应行的主键在缓存中就直接取,如果没有根据主键值在数据库中找,而不是重新执行整个sql。
十八、简述iterator使用缓存的特点?
先执行一次sql取出所有主键,再根据主键值查找缓存,若有直接取出,若没有根据主键在数据库中查相应的对象并进行o/rMapping。对于没缓存的sql,其sql要执行"行数+1"次。对于有缓存的行,执行效率高。综上:第一次查询用list方法,第二查询用iterator方法。
注意事项:
符合需求
速度
冗余
开发的难度
内模型
数据库
九、简述e-r图设计的过程?
找实体
拉关系
写属性
十、简述三级范式?
主键
完全依赖于主键
不出现传递依赖
十一.简述对象的三大状态?
自由(transient)
与session无关
持久(persistent)
由session来管理
在持久状态中通过get方法取出对方
十四、简述hibbernate的缓存?
1、事务级(一级缓存session):当前事务结束缓存结束。
2、应用级(二级缓存SessionFactory):所有session共享同一个SessionFactory的数据。要人为让SesionFactory是单例模式。
3、集群(有多个应用服务器):每一台主机有一个SessionFactory,一个服务器的数据发生改变要通知其它所有服务器同步缓存数据或删除缓存数据,如果删除,下次取时再从数据库中取。集群级缓存要慎用,因为有主机之间有通信,要有socket连接,要同步数据增加网络流通量及系统开销。
一个对象通过get或query.list的方法查询放到一级缓存或二级缓存中时,不能用update直接更新,只通通过set方法更新。
evict:清除缓存。
二十一、简述load与get方法的区别?
相同点:3.2版本
先从一级缓存找,如果没在二级缓存中找的。
load:
如果没有找到报ObjectNotFoundException
五、简述批量删除?
Query query=session.createQuery("update"或"delete");
query.executeUpdate();
不同步缓存
六、简述Tomcat连接池作用及实现步骤?
在容器中预先产生了n个连接实例,客户端不用重新实例化,可以直接取,用完后还可以放回去。
//得到连接
Connection conn = ds.getConnection();
4、hibernate通过连接池实现连接
<session-factory name="foo">
<property name="connection.datasource">java:comp/env/jdbc/sa</property> <!--指定tomcat连接池-->
步骤:
1、将sql-server三个包拷贝到C:\tomcat-6\lib下目录下
2、修改C:/tomcat-6/conf/context.xml为以下内容
<Context path="/chap0" docBase="chap0" debug="5" reloadable="true" crossContext="true">
<property name="hibernate.cache.use_query_cache">true</property>
4、在具体的hbm.xml中说明当前类使用二级缓存
<cache stage="read-only"/>
5、在执行query之前设置其支持二级缓存
query.setCacheable(true);
<Resource name="jdbc/sqlserver" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs;selectMethod=cursor"/>
<property name="jndiName">
<value>java:comp/env/jdbc/name</value>
</property>
</bean>
七、简述hibernate中的主键生成机制?
1、Assigned:手动给定
2、identity:sqlserver、db2、mySql的自动增加
3、jdbc测试代码
Context initCtx = new InitialContext();
//进入连接池环境
Context envCtx = (Context)initCtx.lookup("java:comp/env");
//得到一个连接池
ds = (DataSource)envCtx.lookup("jdbc/sa");
<property name="show_sql">true</property>
<!--是否显示sql-->
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<!--hibernate的驱动管理器-->
系统运行效率快。
悲观锁:一个游标读取一批数据后加锁,另一个事务不可以更新游标中的数据,但游标所在事务的更新一定成功。
系统运行效率慢。
3、可重复读:将上一个sql取的数据临时存储,保证同一个事务内下一个sql与上一个sql取的数据一样。
4、串行化:一个事对表进行select、update、delete、insert时全表加锁,另一个事只可以select不可update、delete、insert。运行速度最慢。
inverse=false是主控方,外键是由它控制的
inverse=true是被控方,外键与它没关系
cascade:级联,要想实现级联必须将从对象作为主对象的属性。
主表增从表增
主表修从表修
主表删从表删
lazy:延迟
lazy=false:不但取当前对象,还取其关联的所有内容
lazy=true:只取当前对象不取关联对象的属性,当真正用到对方属性时才执行sql加载相应的值
十九、简述数据查找的过程?
首先在一级缓存中中找,若没有找到就在二级缓存中,若还是没有找到就产生sql在数据据库中找。
二十、简述缓存的特点?
load、get、insert、update、delete都会自动同步缓存,但query.executeUpdate()不更缓存,但如果批量更新时exeucuteUpdate执行效率很高。
trans.rollback();
Query:执行查询Байду номын сангаас
//hql,类及属性是对象
Query query=session.createQuery("from Customer where customerid=:aa")
query.setString("aa","aa")
List list=query.list();
游离(detached)
被session抛弃
十二、简述没有锁会存在的问题?
1、脏读:一个事务处理的数据是另一个事务没有提交的数据
2、覆盖更新:一个事务将另一个事务的修改覆盖了。
3、不可重复读:一个事务两个相同的sql读取出来的内容不一样。
4、幻想读:同一个事务第一次读有,第二次读没有。
十三、简述锁的分类?
Validator:在做之前进行拦截,在处理之前进行校验
Lifecycle:拦截器,可以增加、修改、查询等之前触发,但其让数据类与hibernate的藕合度增加,一般不用。
public class Users implements Validator,Lifecycle
{
}
interceptor:拦截器,其比Lifecycle更加的优秀,不用每个数据类去实现一些接口,而是在产生session时将其注入到session中。其可以增加、修改、查询等之前触发,但其中的session不可以重用,可以用上一个session的connection,不用管事务,因为事务已被前一个session实现。
四、简述关联组成及作用?
one-to-many:
get/set方法:
一方通过get方法可以取出另一方,另一方也可以通过get方法取出对方,所以在one这边有一个Set属性可以得到所有的many,many这边有一个One类型的属性可以取出one
inverse:主控方,维护外键值,说明外键列由谁来控制,要想维护外键列的值必须将被控方作为主控方的属性,主控方一般在many方。
H
一、简述Hibernate作用?
O/R Mapping(对象关系映射)
将工作量降低95%
二、简述核心配置文件及作用?
hibernate.cfg.xml:数据库的连接、批量处理、加载二级缓存驱动、显示sql
*.hbm.xml:将一个表与类相映射、二级缓存的方式
三、简述核心接口、类组成及作用?
类:
Configuration:读取hibernate.cfg.xml及*..hbm.xml文件
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
</ehcache>
3、在hibernate.cfg.xml中加入两个属性
a、说明提供二级缓存驱动类
b、说明query也支持缓存
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
接口:
SessionFactory:产生具体的session
Session:做具体的操作
save
update
saveOrUpdate:有主键修改,没主键增加
delete
load
Transaction:事务处理
Transaction trans=session.beginTransaction();
trans.commit();
十五、简述利用缓存的原则?
1、数据量在可接收的范围内
2、更新或并发更新少
3、重复查询且使用率高的数据
十六、简述缓存的实现步骤?
1、hibernate提供了支持缓存的接口,通过修改hibernate.cfg.xml设置缓存。
2、将ehcache.jar拷入工程
3、要src的根目录下加入ehcache.xml说明缓存。
<mapping resource="com/accp/t15/Customer.hbm.xml"/>
</session-factory>
5、spring调用tomcat中的连接池
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
3、sequence:oracle的序列
4、native:自动选择identity、sequence,不用手动给定
5、uuid.hex:Hibernate基于128位唯一值产生算法生成16进制数值
八、简述数据库开发的过程?
外模型
以客户为中心,客户可以看懂。
概念模型
以外模型作为输入,适应开发的进一步细化,是外模型全集
1、读未提交:可以读取未提交的数据,不可以防止脏读、覆盖更新。
2、读已提交(数据库默认的处理方式):读取的数据是已提交的,在提交之前当前行的版本与数据库的版本比较,若小于数据库的版本报错回退。
乐观锁:一个游标读取一批数据后不加锁,另一个事务可以更新游标中的数据,但游标所在事务更新另一事务更新过的行时,报错,回退。
十七、简述list使用缓存的特点?
sql只执行一次,直接查询o/r mapping后返回结果,要想重用缓存,hql必须相同,如果相同,相应行的主键在缓存中就直接取,如果没有根据主键值在数据库中找,而不是重新执行整个sql。
十八、简述iterator使用缓存的特点?
先执行一次sql取出所有主键,再根据主键值查找缓存,若有直接取出,若没有根据主键在数据库中查相应的对象并进行o/rMapping。对于没缓存的sql,其sql要执行"行数+1"次。对于有缓存的行,执行效率高。综上:第一次查询用list方法,第二查询用iterator方法。
注意事项:
符合需求
速度
冗余
开发的难度
内模型
数据库
九、简述e-r图设计的过程?
找实体
拉关系
写属性
十、简述三级范式?
主键
完全依赖于主键
不出现传递依赖
十一.简述对象的三大状态?
自由(transient)
与session无关
持久(persistent)
由session来管理
在持久状态中通过get方法取出对方
十四、简述hibbernate的缓存?
1、事务级(一级缓存session):当前事务结束缓存结束。
2、应用级(二级缓存SessionFactory):所有session共享同一个SessionFactory的数据。要人为让SesionFactory是单例模式。
3、集群(有多个应用服务器):每一台主机有一个SessionFactory,一个服务器的数据发生改变要通知其它所有服务器同步缓存数据或删除缓存数据,如果删除,下次取时再从数据库中取。集群级缓存要慎用,因为有主机之间有通信,要有socket连接,要同步数据增加网络流通量及系统开销。
一个对象通过get或query.list的方法查询放到一级缓存或二级缓存中时,不能用update直接更新,只通通过set方法更新。
evict:清除缓存。
二十一、简述load与get方法的区别?
相同点:3.2版本
先从一级缓存找,如果没在二级缓存中找的。
load:
如果没有找到报ObjectNotFoundException
五、简述批量删除?
Query query=session.createQuery("update"或"delete");
query.executeUpdate();
不同步缓存
六、简述Tomcat连接池作用及实现步骤?
在容器中预先产生了n个连接实例,客户端不用重新实例化,可以直接取,用完后还可以放回去。
//得到连接
Connection conn = ds.getConnection();
4、hibernate通过连接池实现连接
<session-factory name="foo">
<property name="connection.datasource">java:comp/env/jdbc/sa</property> <!--指定tomcat连接池-->
步骤:
1、将sql-server三个包拷贝到C:\tomcat-6\lib下目录下
2、修改C:/tomcat-6/conf/context.xml为以下内容
<Context path="/chap0" docBase="chap0" debug="5" reloadable="true" crossContext="true">
<property name="hibernate.cache.use_query_cache">true</property>
4、在具体的hbm.xml中说明当前类使用二级缓存
<cache stage="read-only"/>
5、在执行query之前设置其支持二级缓存
query.setCacheable(true);
<Resource name="jdbc/sqlserver" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs;selectMethod=cursor"/>
<property name="jndiName">
<value>java:comp/env/jdbc/name</value>
</property>
</bean>
七、简述hibernate中的主键生成机制?
1、Assigned:手动给定
2、identity:sqlserver、db2、mySql的自动增加