yutaoaijingjing132 2011-06-30 15:55
浏览 191
已采纳

某公司关于spring和hibernate的面试题!高手来解答!!!!!!!

1
extends HibernateDaoSupport
for(int i=0;i<3;i++){
this.getHibernateTemplate().save(obj);
}
为什么只发出了一次insert语句 就保存了一个user?

2
getHibernateTemplate().save(obj);拿到的session是不是和当前线程绑定的?

3
关闭事务是HibernateTransactionManager是由这个类来关闭的,那么如果我没有配置
事务管理呢,由谁来关闭?
4


tx:attributes





/tx:attributes
/tx:advice
aop:config


/aop:config
在配置事务传播特性的时候我给com.common.service.*这个包进行事务管理,他里边有一些save..,update,delete啥的,也有些关于业务逻辑的接口,例如login。。。,那么我的这个login方法是不是不满足事务的描述 ,他的事务传播方式会走<tx:method
name="*" propagation="SUPPORTS" read-only="true" 对吗?这个包是service层,他们底层调用的都是同一个DAO现类extends HibernateDaoSupport,在这个类里边有CRUD,那么我在DAO层的save里边调用delete方法,在delete方法中我抛出一个runtimeexception 是不是就会事务回滚?因为他们都在同一个事务当中!?这些事务传播特性是指我调用service层时传播,还是说具体到实现类中,还是底层DAO中进行传播呢?
5
spring所谓的单例 是JVM的单例 还是说每个线程单例就像是ThreadLocal,
如果是jvm单例,那么是线程安全的吗?

6
struts2里边的ACTION是否是线程安全的,JVM单例还是每个线程绑定一个?

7
struts2假如每个线程一个ACTION,那么当用SPRING时,SPRING容器NEW出来的是单例(service层)【假如是JVM就存在一个service】,那么每个线程的ACTION调用service时会不会出现线程问题?该如何处理这个问题?

以上为题希望各位大牛给下解释,谢谢

  • 写回答

10条回答 默认 最新

  • iteye_9831 2011-07-01 21:16
    关注

    1 RE: 对于save方法,处理和saveOrUpdate相似,即处理过程如下:
    1、obj创建以后,是瞬态对象;
    2、第1个循环调用save以后,obj状态为持久态;
    3、以后再对已持久化的对象调用save,和调用update作用一样,都被忽略。
    所以只保存一个User。

    2 RE:不一定。原因如下:
    1、如果save操作发生时已打开事务,则拿到的session是和当前线程绑定的;
    2、如果未打开事务,则分两种情况:
    2.1、如果使用了OpenSessionInView模式,并且是默认设置(SingleSession=true),则拿到的session是和当前线程绑定的;
    2.2、否则,拿到的是新session,并且不会绑定到当前线程。

    3 RE:没有配置事务(或者说没有打开事务),何来关闭事务呢?
    Spring下,如果没有打开事务,则使用JDBC自动提交事务,对数据库而言,每一条JDBC语句的执行都是一个事务。

    4 RE:
    1、例如login。。。,那么我的这个login方法是不是不满足事务的描述 ,他的事务传播方式会走 name="*" propagation="SUPPORTS" read-only="true" 对吗?
    -------对的。
    2、那么我在DAO层的save里边调用delete方法,在delete方法中我抛出一个runtimeexception 是不是就会事务回滚?
    ------DAO save方法也会被回滚,甚至到最外层的Sevice方法都会被回滚,因为事务的开启和回滚是围绕Service方法的。
    3、这些事务传播特性是指我调用service层时传播,还是说具体到实现类中,还是底层DAO中进行传播呢?
    ------是指Service方法之间互相调用时的事务传播。
    更具体的,是指不同类的Service方法互相调用之间的传播,同一个Service类之间的方法调用和事务传播没有关系,
    原因很简单,Spring的事务管理是通过AOP(动态代理、或者字节码增强技术)来实现的,调用关系是:
    外部类----->动态代理类------>被代理的Service类(只有经过动态代理类,事务管理或者事务传播才发生作用,
    在Service类内部互相调用、Service调用DAO、DAO之间互相调用都和事务传播无关)

    5 RE:默认情况下在容器内是唯一的。但好像也可以设置线程唯一、每请求唯一,具体记不清了。
    如果是jvm单例,那么是线程安全的吗?
    ------这儿的线程安全,如果是指BeanFactory.getBean()的话,是线程安全的;
    否则的话,具体的Bean对象是否线程安全和是否被Spring管理没关系。比如,通常情况下我们的Service都是单例的,
    同时Service也设计成是无状态的,这种情况下Service就是线程安全的(因为它压根没有状态);
    否则,如果Service有状态,并且这个状态是可变的话,那就不是线程安全的,设计中应避免这种情况。

    6 RE:因为ACTION默认使用prototype,每次请求都会创建一个新的Action对象,所以,Action虽然不是线程安全的,但不会出现并发错误。
    JVM单例还是每个线程绑定一个? -----严格说不是每线程绑定一个,应该是每请求绑定一个,
    因为线程对象是在线程池中被重复使用的,在每次请求到来时,Struts2过滤器会把Action绑定到ThreadLocal,在请求结束时,把Action从当前线程剥离。

    7 RE:当前不会出现问题。
    Service之所以可以单例使用,就因为Service需要或者应该被设计成无状态的、也就是线程安全的。
    线程安全也就是说可以被任意使用,不会有并发问题。

    题外话,后面的几个题目(5/6/7)感觉不像是面试题,像是新手题目,因为问的太弱智了。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程