我有一個用例,其中它調用以下內容:@Override@Transactional(propagation=Propagation.REQUIRES_NEW)public UserControl getUserControlById(Integer id){ return this.userControlRepository.getOne(id);}觀察@Transactionalhas具有Propagation.REQUIRES_NEW,并且存儲庫使用getOne。當我運行該應用程序時,我收到以下錯誤消息:Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session...但是,如果我改變getOne(id)的findOne(id)一切工作正常。順便說一句,在用例調用getUserControlById方法之前,它已經調用了insertUserControl方法@Override@Transactional(propagation=Propagation.REQUIRES_NEW)public UserControl insertUserControl(UserControl userControl) { return this.userControlRepository.save(userControl);}這兩種方法都是Propagation.REQUIRES_NEW,因為我正在執行簡單的審核控制。我使用該getOne方法是因為它是在JpaRepository接口中定義的,并且我的Repository接口從那里擴展,所以我正在使用JPA。該JpaRepository接口擴展自CrudRepository。該findOne(id)方法在中定義CrudRepository。我的問題是:為什么該getOne(id)方法失???什么時候應該使用該getOne(id)方法?我正在使用其他存儲庫,并且都使用該getOne(id)方法并且都正常工作,只有當我使用Propagation.REQUIRES_NEW時,它才會失敗。根據getOne API:返回對具有給定標識符的實體的引用。根據findOne API:通過其ID檢索實體。3)什么時候應該使用該findOne(id)方法?4)建議使用哪種方法?提前致謝。
3 回答

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
1.為什么getOne(id)方法失???
請參閱文檔中的本節。你重寫已經到位交易可能導致該問題。但是,如果沒有更多信息,則很難回答。
2.什么時候應該使用getOne(id)方法?
沒有挖掘到Spring數據JPA的內部,差別似乎是用來檢索實體的機制。
如果您在“ 另請參見 ” 下查看JavaDoc:getOne(ID)
See Also:
EntityManager.getReference(Class, Object)
似乎此方法只是委托給JPA實體管理器的實現。
然而,該文檔為findOne(ID)沒有提到這一點。
線索也在存儲庫的名稱中。 JpaRepository是JPA專用的,因此可以根據需要將調用委派給實體管理器。 CrudRepository是不可知使用的持久性技術??催@里。它用作多種持久性技術(如JPA,Neo4J等)的標記接口。
所以這是不是一個真正的“差異”的兩種方法供您使用的情況下,它只是findOne(ID)比更專業更通用getOne(ID)。您使用哪一個取決于您和您的項目,但是我個人會堅持使用,findOne(ID)因為這會使您的代碼減少實現的特定性,并且為將來無需過多重構就可以遷移到MongoDB等之類打開大門。
- 3 回答
- 0 關注
- 1568 瀏覽
添加回答
舉報
0/150
提交
取消