2015-04-08 79 views
1

我有一個關於這個服務和它的DAO對象如何執行持久性事務的問題。Java 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(); 
    } 

} 
+0

你忽略了Java的基礎知識(以及一些Spring)。顯然在運行時注入了'UserDAO'的具體實現。 – Kayaman

+0

謝謝你的回覆。是的,我在春天還很綠。你在這裏指的是依賴注入?這是通過@autowire註釋和xml配置文件進行管理的嗎? – Jnanathan

+0

在這種情況下(使用@Autowired),可能沒有xml配置,而是Java配置。一個合適的bean將在運行時注入'userDAO',否則會拋出錯誤。 – Kayaman

回答

1

首先,不能創建的接口的實例中,參考變量可以用於接口來創建。然而,當我跟着鏈接發現你正在用Hibernate學習Spring。 Spring提供了一個稱爲依賴注入的工具,這就是爲什麼在你的UserManagerImpl類中有@Autowire註解,這意味着你已經在UserManagerImpl類中注入了一個依賴UserDAO,所以在朗姆酒時間,spring將提供實現了UserDAO接口的類的實例。你所忽略的是對春天概念的深入研究,順便一提。

+1

謝謝Alok!那麼,這基本上是爲了在代碼架構中提供更多的模塊化? – Jnanathan

+1

是的,這有助於使應用程序鬆散耦合(即獨立類)。依賴可以根據需要'注入'@ Jnanathan –