再用jpa+spring+struts2開發的是時候遇到一個問題(采用了注解的方式,xml配置的道理是一樣的),當我在注冊用戶的時候,注冊第一個用戶沒有問題,但注冊第二個用戶開始就會拋出一個異常:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.dalton.domain.User
原因是第二次插入用戶的時候,還沒有實例化到數據庫就有了ID值,而且這個ID值是我第一次插入用戶的ID,這是不正常,因為ID沒有設置過,而且JPA默認的行為是只要指定了主鍵生成策略,主鍵就不能設置了,一旦不為空或者0就被認為是已經保存到了數據庫中,一旦調用persist()方法就會拋出上面的異常。
為什么會還有第一次的插入用戶的信息呢,原因就是action的作用域設置錯誤了,采用了默認單例的設置,對於Action來說必須采用prototype(每次調用創建一個對象)的作用域,修改方法是:在Action上就一個注解@Scope("prototype")
就可以輕松搞定。