当前位置: 首页 > news >正文

关于Java中分层中遇到的一些问题

Java分层中遇到的问题

陆陆续续写了一些Java的项目,用了Spring系列和Hibernate这样的框架。在设计Service层和Dao层的时候碰到了一些想不清楚的问题。
以一个简单的用户信息管理功能为例,如果不用Spring Data之类的东西。那么我一般会这么写代码
controller往上没什么好说的,controller调用service就好了,service调用dao。
关键在于service这里。我可能会这么写

...
@Autowired
UserDao userDao;

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

然后在整个service的实现类上面注解@Transaction
Dao实现的代码就是

...
@Autowired
SessionFactory 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层似乎也是不好的做法。

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

相关文章:

  • 156:Ananagrams
  • 区块链技术
  • 浅度理解NodeJS的HTTP模块
  • Git的本地仓库与GitHub的远程仓库
  • haproxy+pacemaker高可用负载均衡
  • 剖析RAC中的@weakify、@strongify
  • 解析PE资源表与重定位表
  • BTA | 周政军:区块链中侧链和分片解决不了的扩容问题,交给DAG吧!
  • PHP定时任务Crontab结合CLI模式详解
  • go append函数以及写入
  • mysql错误Table ‘./mysql/proc’ is marked as crashed and should be repaired
  • 于小镭:区块链将从三方面带来颠覆性认知革命
  • xtrabackup备份和还原
  • 什么时候使用HashMap?它有什么特点?
  • html中表格td的宽度如何设置
  • [NodeJS] 关于Buffer
  • [笔记] php常见简单功能及函数
  • [译]如何构建服务器端web组件,为何要构建?
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【笔记】你不知道的JS读书笔记——Promise
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • C++11: atomic 头文件
  • django开发-定时任务的使用
  • ES6简单总结(搭配简单的讲解和小案例)
  • GraphQL学习过程应该是这样的
  • MySQL QA
  • Quartz初级教程
  • rabbitmq延迟消息示例
  • Tornado学习笔记(1)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • VUE es6技巧写法(持续更新中~~~)
  • 对JS继承的一点思考
  • 那些年我们用过的显示性能指标
  • 爬虫模拟登陆 SegmentFault
  • 温故知新之javascript面向对象
  • - 转 Ext2.0 form使用实例
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • (1)Nginx简介和安装教程
  • (arch)linux 转换文件编码格式
  • (NSDate) 时间 (time )比较
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (三)mysql_MYSQL(三)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)关于pipe()的详细解析
  • (转)树状数组
  • *2 echo、printf、mkdir命令的应用
  • .NET MVC之AOP
  • .Net mvc总结
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 读取 JSON格式的数据
  • .NET 事件模型教程(二)