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

标签 java oop design-patterns orm

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

假设我有一个像这样的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 对象会发生什么情况呢?任何澄清都会非常有帮助。

谢谢!

最佳答案

Then what happens to the user object in thread A? Any clarification would be very helpful.

什么都没有。当然这可能是你的问题。如果您在删除后尝试在线程 A 中保留,会发生什么,这可能高度依赖于您正在使用的 ORM,但我猜测假设您使用 Hibernate,它会在尝试执行 UPDATE 时失败/DELETE 因为线程 A 中打开的 Session 不知道该行丢失。这种情况经常发生。

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

人们通过多种方式缓解这个问题:

  1. 默默地接受异常并重新插入对象或忽略
  2. 提升异常(通常是乐观锁定异常)并转换为用户友好的错误。
  3. 从一开始就绝不允许删除。使用 boolean 列来指示删除。
  4. 使您的应用程序实现与 ORM 乐观锁定同步的乐观锁定。
  5. 使用事务和/或同步(单个 JVM)
  6. 使用事务和行锁定SELECT ... FOR UPDATE

在大多数情况下,我会选择数字 2 和/或 3。数字 5 是最悲观的,需要大量资源,并且有可能出现死锁。

关于java - 我应该如何处理对象关系映射中对象的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822428/

相关文章:

java - HQL - 更新字段并在一个查询中返回结果值

java - 如何强制 Java 8 流按顺序执行?

java - 我的 findCombos 方法不起作用,如何从 java 字符数组中删除字符

相互依赖的类的 C++ 继承

php - 静态方法与静态实例

java - Java 中的 Singleton 类可以接受吗?

c++ - 在硬件接口(interface)之间切换的最佳设计模式

java - 如何使用 bufferedreader 和 treemap 打印文本中最常见的单词? - java

java - 将对象本身 (this) 传递给字段的方法是一种糟糕的方法吗?

Java 从多个 session 与数据库进行安全通信