Java DAO 对象事务

Posted

技术标签:

【中文标题】Java DAO 对象事务【英文标题】:Java DAO Object Transactions 【发布时间】:2015-06-13 12:24:58 【问题描述】:

我有一个关于此服务及其 DAO 对象如何执行持久性事务的问题。

该服务正在数据库上执行事务——但它没有使用 DAOImpl 对象——而是使用作为接口实例的对象——并且自然没有任何方法签名的实现。在我看来,这应该无法执行任何有意义的操作。我在这里忽略了什么吗?

代码的完整链接

http://www.byteslounge.com/tutorials/spring-with-hibernate-persistence-and-transactions-example

@Service
public class UserManagerImpl implements UserManager 

  @Autowired
  private UserDAO userDAO;

  @Override
  @Transactional
  public void insertUser(User user) 
    userDAO.insertUser(user);
  

  @Override
  @Transactional
  public User getUserById(int userId) 
    return userDAO.getUserById(userId);
  

  @Override
  @Transactional
  public User getUser(String username) 
    return userDAO.getUser(username);
  

  @Override
  @Transactional
  public List<User> getUsers() 
    return userDAO.getUsers();
  




public interface UserDAO 

      void insertUser(User user);

      User getUserById(int userId);

      User getUser(String username);

      List<User> getUsers();
    


@Service
public class UserDAOImpl implements UserDAO 

  @Autowired
  private SessionFactory sessionFactory;

  @Override
  public void insertUser(User user) 
    sessionFactory.getCurrentSession().save(user);
  

  @Override
  public User getUserById(int userId) 
    return (User) sessionFactory.
      getCurrentSession().
      get(User.class, userId);
  

  @Override
  public User getUser(String username) 
    Query query = sessionFactory.
      getCurrentSession().
      createQuery("from User where username = :username");
    query.setParameter("username", username);
    return (User) query.list().get(0);
  

  @Override
  @SuppressWarnings("unchecked")
  public List<User> getUsers() 
    Criteria criteria = sessionFactory.
      getCurrentSession().
      createCriteria(User.class);
    return criteria.list();
  


【问题讨论】:

您忽略了 Java 的基础知识(以及一些 Spring)。显然在运行时注入了UserDAO 的具体实现。 感谢您的回复。是的,我在春天仍然很绿。您在这里指的是依赖注入吗?这是通过@autowire 注释和 xml 配置文件管理的吗? 在这种情况下(使用@Autowired)可能没有xml配置,而是Java配置。运行时会向userDAO注入合适的bean,否则会抛出错误。 知道了。我想。我将不得不阅读一些关于自动装配如何工作的内容。但是为什么不直接在 DAO 本身上声明一个 DAOImpl 的实例呢? 【参考方案1】:

首先,不能创建接口的实例,可以为接口创建引用变量。尽管如此,当我点击链接并发现您正在使用 Hibernate 学习 Spring 时。 Spring 为您提供了一个名为 Dependency Injection 的工具,这就是为什么在 UserManagerImpl 类中有 @Autowire 注释的原因,这意味着您已经在 UserManagerImpl 类中注入了一个依赖 UserDAO,因此在朗姆酒时间,spring 将提供实现 UserDAO 接口的类的实例。您所忽略的是对 Spring 概念的深入研究。顺便说一句,一切顺利。

【讨论】:

谢谢你!那么,这本质上是为了在代码架构中提供更多的模块化? 是的,这有助于使您的应用程序松散耦合(即独立类)。可以根据需要“注入”依赖项。@Jnanathan

以上是关于Java DAO 对象事务的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在Java Spring和Hibernate的单个事务中管理2个DAO方法?

Java -- Spring学习笔记7Spring事务

Java框架spring学习笔记(十八):事务操作

正确实现一个 dao 类来管理事务

Spring_7-Spring事务

Servlet通过 @Autowired注入service后事务失效,但是controller其它注入service事务正常,求指正