脚本宝典收集整理的这篇文章主要介绍了

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

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

总结

以上是脚本宝典为你收集整理的

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

全部内容,希望文章能够帮你解决

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

所遇到的程序开发问题,欢迎加入QQ群277859234一起讨论学习。如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典网站推荐给程序员好友。 本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

80%的人都看过