2017-03-16 82 views
2

我正在嘗試使用Spring和Hibernate框架的Active Record模式。以下是對這種模式的描述:我可以將@Transactional註釋放置到實體類嗎?

一個對象攜帶數據和行爲。大部分數據都是持久的,需要存儲在數據庫中。 Active Record使用最明顯的方法,將數據訪問邏輯放入域對象中。這樣,所有人都知道如何讀寫數據庫中的數據。

因此,我刪除了傳統的Service類,並將其邏輯和@Transactional註釋移至實體類。但是當我再次運行我的應用程序時,下面的異常被拋出。

@Entity 
@Table(name="USERS") 
@Transactional 
public class User { 
    @Id 
    @GeneratedValue 
    private int id; 
    private String name; 
    private String password; 

    @Transient 
    private UserDao userDao; 

    public User() {} 
    public User(UserDao userDao, String username, String password) { 
     ... 
    } 

    public void register() { 
     userDao.save(this); 
    } 
} 

UserDao類:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:133) 
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:454) 
    weibo.datasource.UserDao.save(UserDao.java:17) 
    weibo.domain.User.register(User.java:32) 
    weibo.web.UserController.register(UserController.java:29) 

源代碼

UserController類:

@PostMapping("https://stackoverflow.com/users/register") 
public String register(@RequestParam("username") String username, 
         @RequestParam("password") String password) { 
    User user = new User(userDao, username, password); 
    user.register(); 
    return "redirect:/users/login"; 
} 

User實體類。沒有@Transactional註釋。

public UserDao(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 
public void save(User user) { 
    sessionFactory.getCurrentSession().save(user); 
} 

爲什麼?

UPDATE

正如@cristianhh所說,@Transactional註釋必須在Spring管理豆使用。但是,實體類不是。

+0

否@Transactional必須位於您的UserDao類中。 –

+0

@EssexBoy在傳統的Controller-Service-Dao實現中,最好將此註釋添加到「Service」類而不是「Dao」類。請參閱http://stackoverflow.com/questions/1079114/where-does-the-transactional-annotation-本身 – walsh

回答

4

不,而@Transactional由Spring管理,@Entity由Hibernate管理。

Hibernate bean不是由Spring管理的,並且不能被@Transactional註解打包。

但是,您可以在服務/存儲庫層中使用@Transactional幷包裝發送實體的數據訪問對象(DAO)的函數。

+0

哦,你是對的。謝謝。 – walsh

+0

另一個問題:我將註釋移到了'UserController'類,但拋出了相同的異常。爲什麼? – walsh

+0

當然這不是一個好習慣,我只是想知道源代碼的原因。 – walsh

相關問題