博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Java中分层中遇到的一些问题
阅读量:7231 次
发布时间:2019-06-29

本文共 1198 字,大约阅读时间需要 3 分钟。

Java分层中遇到的问题

陆陆续续写了一些Java的项目,用了Spring系列和Hibernate这样的框架。在设计Service层和Dao层的时候碰到了一些想不清楚的问题。

以一个简单的用户信息管理功能为例,如果不用Spring Data之类的东西。那么我一般会这么写代码
controller往上没什么好说的,controller调用service就好了,service调用dao。
关键在于service这里。我可能会这么写

...@AutowiredUserDao userDao;public void saveUser(String userName){    userDao.save(userName);}public User findUser(String userName){    return userDao.findUser(userName);}...

然后在整个service的实现类上面注解@Transaction

Dao实现的代码就是

...@AutowiredSessionFactory sessionFactory;public void save(String userName){    Session session=sessionFactory.getCurrentSession();    session.save(userName);}...

问题就来了,如果按照这样的写法,那么首先Hibernate的一级缓存似乎就没有起到作用了

因为在Dao中,每一个方法都获取一个Session来进行操作,方法间并不共享Session。也就是说如果Service的一个方法中调用了Dao的两个方法,这两个方法的Session不一样,一级缓存根本没用。

其次就是Service层中查找出来的对象是游离态的

在Service的方法中如果find了一个对象然后调用这个的对象的Set方法,数据库中是不会更新的。因为调用Dao的find方法后Session关闭,对象从持久态变成了游离态,所以这时候要更新对象的信息只能手动再写一句update(User u),就是这样:

public void update(String userName,String password){    User u=userDao.findUser(userName);    u.setPassword(password);    userDao.update(u);}

这显然是不好的一种方式。

但是如果想改掉前面两个缺点,就必须把Session提到Service层,让Service的一个方法用一个Session,这样上面提到的两个问题就都能解决。可是Session本应该是Dao层的东西,提升到Service层似乎也是不好的做法。

不知道这里头的矛盾到底怎么解决?

转载地址:http://bycfm.baihongyu.com/

你可能感兴趣的文章
通过Git WebHooks+脚本实现自动更新发布代码之shell脚本
查看>>
对象实例化、字符串的使用方法
查看>>
keepalived基于LVS实现高可用,实现web服务的高可用
查看>>
80端口被Microsoft-HTTPAPI/2.0占用的解决办法
查看>>
无法抗拒Minecraft给予超高的自由度和探索-微访谈
查看>>
数据结构之串
查看>>
我的友情链接
查看>>
lvs+keepalived+nginx+tomcat高可用高性能集群部署
查看>>
实验:搭建主DNS服务器
查看>>
org.gjt.mm.mysql.Driver与com.mysql.jdbc.Driver区别
查看>>
部署exchange2010三合一:之五:功能测试
查看>>
nginx编译安装参数
查看>>
代码托管
查看>>
第一次给ThinkPHP5核心框架提pull request的完整过程
查看>>
U-Mail邮件系统何以誉为信息整合中转枢纽
查看>>
强大的vim配置文件,让编程更随意
查看>>
崛起于Springboot2.X之配置文件详解(10)
查看>>
定时执行程序-Quartz简单实例
查看>>
【CF 应用开发大赛】MyfCMS系统
查看>>
windows下kangle虚拟主机-架设java空间的教程及心得
查看>>