Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该如何处理对象关系映射中对象的删除_Java_Oop_Design Patterns_Orm - Fatal编程技术网

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

Java 我应该如何处理对象关系映射中对象的删除,java,oop,design-patterns,orm,Java,Oop,Design Patterns,Orm,我对如何处理对象的不同生命周期事件感到困惑,这些事件在数据库中被持久化。我知道这可能因设计而异,但我想知道在这种情况下遵循的任何标准/最佳实践 假设我有一个像这样的User类- class User { int id; String name; } 此类型的对象表示数据库中的一行。对象由多个线程访问。那么,如何管理对象呢?它的方法是什么?如何实现删除此类对象 假设有两个线程,A和B正在访问同一个用户对象 // Thread A User user = UserFactory.getUs

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

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


谢谢

据我所知,对于访问一个对象的线程来说,这是一种免费的方式,这意味着它们都可以访问同一个对象,除非使用同步/锁定

根据我从伪代码中收集到的信息,删除对象将完全从系统中删除它(包括访问它的任何线程),但我相信这取决于删除它的方式。如果删除线程本身内的对象,它应该只从该线程中删除该对象,但是如果删除线程外的对象,它应该从整个系统中删除该对象

从我看到的代码来看,我很难确定您是试图删除线程B中的对象,还是在代码的其余部分中删除它,但是无论您试图完成什么,我希望我上面的解释能有所帮助

那么线程A中的用户对象会发生什么情况?任何澄清都会很有帮助

没什么。当然,这可能是你的问题。如果在删除后尝试在线程
A
中持久化,会发生什么情况可能在很大程度上取决于您正在使用的ORM,但我猜想,假设您使用Hibernate,它将无法尝试执行
更新/删除
,因为线程
A
中的打开
会话
不知道该行丢失。这种情况经常发生

请注意线程
A
始终能够自由地对用户对象进行变异,而不会出错,只要它不持久/删除。只有在执行“持久化/删除”时,才会发生此错误。在这种情况下,第一个持久化/删除的人获胜(无错误)

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

  • 默默地接受异常并重新插入对象或忽略
  • 升级异常(通常是乐观锁定异常)并转换为用户友好的错误
  • 首先决不允许删除。使用布尔列表示删除
  • 使您的应用程序实现与ORM的乐观锁定同步的乐观锁定
  • 使用事务和/或
    同步
    (单个JVM)
  • 使用事务和行锁定
    选择。。。用于更新

  • 在大多数情况下,我用数字2和/或3。数字
    5
    是最悲观的,它需要大量资源,可能会导致死锁。

    您不应该允许这样做。如果用户正在使用,您必须以某种方式阻止该用户,或者如果其他线程正在访问该用户,则必须允许只读操作。我想我应该只保留该对象的一个实例。因此,线程将访问同一对象,并且任何更新操作都将同步。但是我不知道如何实现用户的删除。好吧,我想确定如果任何线程对
    user
    对象执行删除操作,该对象将失效,其他有权访问该对象的线程将收到删除通知。@jaibatrik在Java中不可能以这种方式暂停其他线程。您要么需要有一个全局锁或一个锁池,要么只接受数据可能在另一个线程中更改的事实,当您继续执行时,故障就会发生。看看我的答案,亚当·金特是对的。在Java中,你不能这样暂停其他线程,但他给了你一些解决这个问题的方法,所以一定要尝试一下@我会投票支持你的答案,但我还没有获得必要的代表资格。不过干得好!