2

我对 JPA 比较陌生,并且对如何最好地乐观地锁定和刷新实体感到非常困惑。我想要一套通用的方法来在我的项目中始终如一地处理这个问题。

我可能从一个不知道实体状态的方法中调用锁定/刷新方法,它可能已经传递了一个分离的或新的/未保存的实体对象以及一个先前从数据库中读取的实体对象。为简单起见,我希望我的实用程序方法能够处理所有可能发生的情况。从语义上讲,我尝试实现的方法是:

MyEntity refreshAndLock(MyEntity e)
从数据库中重新读取实体并乐观地锁定它,或者对尚未保存到数据库的实体不做任何事情。分离的实体也将被重新读取和锁定,并返回一个托管版本。

MyEntity refresh(MyEntity e)
只需重新读取实体,或对尚未保存到数据库的实体执行任何操作。分离的实体也将被重新读取。

MyEntity lockAndNotRefresh(MyEntity e)
锁定内存中实体的版本(可能已经过期)

任何提示或链接都非常感激地接受。我还没有找到明确的指导,这让我很惊讶,因为这似乎是一个常见的要求。

4

1 回答 1

1

第一,我的主要建议是:不要尝试实现自己的通用数据访问层。你可以EntityManager为你做所有的事情。保持你的代码简单,不要过度设计。使用通用层很可能会引入新问题并降低可维护性。

第二,您必须问自己,您的应用程序的典型用例是什么才能决定锁定。加锁总是带来瓶颈问题和可能的死锁问题。因此,如果您的应用程序读取的内容远多于写入的内容,或者可能不会一次访问同一个实体,那么您最好使用乐观锁定,然后处理异常。JPA 为您提供版本控制,因此您始终知道是否有其他线程更改了您的对象。如果您真的需要悲观锁定,请继续为这些情况设置它。

于 2013-04-09T09:06:32.733 回答