2016-07-06 50 views
0

我想搜索當前的持久化上下文,如果有必要,搜索實體存在的支持數據庫。這是一個獨立的java-se應用程序。 (它不會在java-ee應用程序容器中運行。)我不必擔心線程安全。我是否需要在EntityTransaction的上下文中查詢數據庫?調用entityManager.find()是否需要EntityTransaction?

這種方式或另一種方式有潛在的差異嗎?

entityManager.getTransaction.begin(); 
MyEntity me = entityManager.find(MyEntity.class, myEntity.getPrimaryKey()); 
entityManager.getTransaction.commit(); 

回答

1

沒有一個只讀它不是必需的操作。

配售類型FORE_VERSION_INCREMENT或一些其它更高級的鎖的鎖被轉動操作到僅被讀取。在這種情況下,它需要交易。

1

有一些情況(涉及鎖),其中find確實需要事務處理。

參照官方JPA specification(最終版本,JPA 2.1)第3.1.1節(第79頁),我們發現:

find方法(前提是它被調用鎖或調用LockModeType.NONE) 和getReference方法是而不是需要在事務中被調用。

在場景描述你安全地調用em.find(..)沒有EntityTransaction

希望它有幫助。

+0

我的答案是100%正確的,因爲在你提到的情況下它們不是READ_ONLY。在您放置鎖的那一刻,版本字段將跳轉,並且操作將不再是READ_ONLY,因此您將需要事務。但只要您保持READ_ONLY操作事務不需要。如果你再讀一遍,這就是我在我的帖子中所說的「只要它是隻讀的,不需要交易」 –