Java DAO 对象事务
Java DAO Object Transactions
我有一个关于此服务及其 DAO 对象如何执行持久性事务的问题。
该服务正在数据库上执行事务 - 但它没有使用 DAOImpl 对象 - 它而是使用一个作为接口实例的对象 - 并且自然没有任何方法签名的实现。在我看来,这应该无法执行任何有意义的操作。我是不是忽略了什么?
完整 link 代码
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();
}
}
首先,不能创建接口实例,可以为接口创建引用变量。尽管如此,当我跟随 link 并发现您正在学习 Spring 与 Hibernate 时。 Spring 为您提供了一个称为依赖注入的工具,这就是为什么在您的 UserManagerImpl class 中有 @Autowire 注释的原因,这意味着您已经在 UserManagerImpl class 中注入了一个依赖项 UserDAO,所以朗姆酒时间,spring 将提供实现UserDAO 接口的class 的实例。您忽略的是彻底研究Spring concepts.by 的方式,一切都是最好的。
我有一个关于此服务及其 DAO 对象如何执行持久性事务的问题。
该服务正在数据库上执行事务 - 但它没有使用 DAOImpl 对象 - 它而是使用一个作为接口实例的对象 - 并且自然没有任何方法签名的实现。在我看来,这应该无法执行任何有意义的操作。我是不是忽略了什么?
完整 link 代码
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();
}
}
首先,不能创建接口实例,可以为接口创建引用变量。尽管如此,当我跟随 link 并发现您正在学习 Spring 与 Hibernate 时。 Spring 为您提供了一个称为依赖注入的工具,这就是为什么在您的 UserManagerImpl class 中有 @Autowire 注释的原因,这意味着您已经在 UserManagerImpl class 中注入了一个依赖项 UserDAO,所以朗姆酒时间,spring 将提供实现UserDAO 接口的class 的实例。您忽略的是彻底研究Spring concepts.by 的方式,一切都是最好的。