我该如何处理对象关系映射中的对象删除

时间:2013-05-29 19:37:27

标签: java oop design-patterns orm

我对如何处理Object的不同生命周期事件感到困惑,因为它们被保存在数据库中。我知道这可能因设计而异,但我想知道在这种情况下遵循的任何标准/最佳实践。

说我有一个User这样的课程 -

class User {
  int id;
  String name;
}

此类型的对象表示数据库中的一行。多个线程访问对象。那么,你如何管理对象?它的方法是什么?你如何实现删除这样的对象?

假设有两个线程,A和B正在访问同一个用户对象。

// Thread A
User user = UserFactory.getUser(userId);

// Thread B
User user = UserFactory.getUser(userId)
user.delete(); // Or UserFactory.delete(userId)

那么线程A中的user对象会发生什么?任何澄清都会非常有用。

谢谢!

2 个答案:

答案 0 :(得分:1)

根据我的理解,就访问对象的线程而言,它是免费的,这意味着除非使用同步/锁定,否则它们都可以访问同一个对象。

从我能从伪代码中收集的内容中,删除对象会将其从系统中完全删除(包括访问它的任何线程),但我认为这取决于您删除它的方式。如果删除线程本身内的对象,它应该只从该线程中删除它,但如果删除线程外的对象,则应将其从整个系统中删除。

从我看到你的代码,我无法确定你是否试图删除线程B中的对象或在其余代码中删除它,但无论你想要完成什么,我希望我的上述解释帮助

答案 1 :(得分:1)

  

那么线程A中的用户对象会发生什么?任何澄清都会非常有用。

无。当然这可能是你的问题。如果你试图在删除后坚持线程A可能会高度依赖于你正在使用的ORM会发生什么,但我猜你假设你使用Hibernate会失败尝试UPDATE/DELETE作为线程Session中的open A不知道该行丢失了。这经常发生。

注意线程A将始终能够自由地改变用户对象而不会出现错误,只要它不会持久/删除。只有当你坚持/删除时才会发生错误。在这种情况下,谁首先持久/删除胜利(没有错误)。

人们以各种方式缓解这个问题:

  1. 默默地吞下异常并重新插入对象或忽略
  2. 提升异常(通常是乐观锁定异常)并转换为用户友好错误。
  3. 绝不允许删除。使用布尔列表示删除。
  4. 使您的应用程序实现乐观锁定与ORM的乐观锁定同步。
  5. 使用事务和/或synchronized(单个JVM)
  6. 使用事务和行锁定SELECT ... FOR UPDATE
  7. 在大多数情况下,我使用数字2和/或3.数字5是最悲观的,需要大量资源并且可能存在死锁。