资讯专栏INFORMATION COLUMN

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

wuaiqiu / 489人阅读

摘要:我可能会这么写然后在整个的实现类上面注解实现的代码就是问题就来了,如果按照这样的写法,那么首先的一级缓存似乎就没有起到作用了。也就是说如果的一个方法中调用了的两个方法,这两个方法的不一样,一级缓存根本没用。

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69067.html

相关文章

  • Spring Web

    摘要:认证鉴权与权限控制在微服务架构中的设计与实现一引言本文系认证鉴权与权限控制在微服务架构中的设计与实现系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与权限控制的实现。 java 开源项目收集 平时收藏的 java 项目和工具 某小公司RESTful、共用接口、前后端分离、接口约定的实践 随着互联网高速发展,公司对项目开发周期不断缩短,我们面对各种需求,使用原有对接方式,各端已经很...

    Kosmos 评论0 收藏0
  • 如何开发一款以太坊(安卓)钱包系列1 - 通过助记词创建账号

    摘要:本文首发于深入浅出区块链社区原文链接以太坊安卓钱包系列通过助记词创建账号原文已更新,请读者前往原文阅读上周我开源了一款钱包,反映很好,一周时间不到已经快到。的功能和类似,它是比特币协议的实现,他实现了及相关协议。 本文首发于深入浅出区块链社区原文链接:以太坊(安卓)钱包系列1 - 通过助记词创建账号原文已更新,请读者前往原文阅读 上周我开源了一款钱包,反映很好,一周时间不到已经快到10...

    bbbbbb 评论0 收藏0
  • 如何开发一款以太坊(安卓)钱包系列1 - 通过助记词创建账号

    摘要:本文首发于深入浅出区块链社区原文链接以太坊安卓钱包系列通过助记词创建账号原文已更新,请读者前往原文阅读上周我开源了一款钱包,反映很好,一周时间不到已经快到。的功能和类似,它是比特币协议的实现,他实现了及相关协议。 本文首发于深入浅出区块链社区原文链接:以太坊(安卓)钱包系列1 - 通过助记词创建账号原文已更新,请读者前往原文阅读 上周我开源了一款钱包,反映很好,一周时间不到已经快到10...

    genefy 评论0 收藏0
  • Java开发

    摘要:大多数待遇丰厚的开发职位都要求开发者精通多线程技术并且有丰富的程序开发调试优化经验,所以线程相关的问题在面试中经常会被提到。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 JVM 内存溢出实例 - 实战 JVM(二) 介绍 JVM 内存溢出产生情况分析 Java - 注解详解 详细介绍 Java 注解的使用,有利于学习编译时注解 Java 程序员快速上手 Kot...

    LuDongWei 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<