Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
是否可以引用已删除的JPA实体?_Jpa_Eclipselink_Jpa 2.0 - Fatal编程技术网

是否可以引用已删除的JPA实体?

是否可以引用已删除的JPA实体?,jpa,eclipselink,jpa-2.0,Jpa,Eclipselink,Jpa 2.0,我有一个JPA实体,可以链接到其他实体——类似这样: @Entity class LinkRec implements Serializable { ... @OneToOne private OtherEntity otherTable; ... } 因此,我的逻辑最终可以删除这个实体(调用EntityManger.remove方法),然后我想将所做的事情写入日志文件,包括其他表对象的引用成员。这是JPA中允许的操作吗?规范中的相关行是: 删除实体后,其状态(生

我有一个JPA实体,可以链接到其他实体——类似这样:

@Entity
class LinkRec implements Serializable {
    ...
   @OneToOne
   private OtherEntity otherTable;
     ...
}

因此,我的逻辑最终可以删除这个实体(调用
EntityManger.remove
方法),然后我想将所做的事情写入日志文件,包括其他表对象的引用成员。这是JPA中允许的操作吗?

规范中的相关行是:

删除实体后,其状态(生成的状态除外)将是调用删除操作时的实体状态

由于这是我在规范中所能找到的关于这个主题的全部内容,我想说,它可能因实现而异。在我看来,这使你所做的事情变得危险。它可以在一个JPA实现中工作而不是在另一个JPA实现中,或者在一个版本中工作而不是在升级中


如果我不得不猜测实现,我会说@OneToOne对象可能可以正常工作。我会担心的是像“一家公司”这样的事情。例如,在Hibernate的情况下:此集合可能已水合并在内存中,但也可能指向代理。如果它是一个代理,您调用getter,它将与数据库一起检查集合,并且由于对象已丢失而无法加载它。

规范中的相关行是:

删除实体后,其状态(生成的状态除外)将是调用删除操作时的实体状态

由于这是我在规范中所能找到的关于这个主题的全部内容,我想说,它可能因实现而异。在我看来,这使你所做的事情变得危险。它可以在一个JPA实现中工作而不是在另一个JPA实现中,或者在一个版本中工作而不是在升级中

如果我不得不猜测实现,我会说@OneToOne对象可能可以正常工作。我会担心的是像“一家公司”这样的事情。例如,在Hibernate的情况下:此集合可能已水合并在内存中,但也可能指向代理。如果它是一个代理,并且您调用getter,它将与数据库一起检查集合,并且由于对象已丢失而无法加载它

这是JPA允许的操作吗

当您调用
remove
时,JPA(底层JPA提供程序)所做的只是“标记”该实例将被删除/删除。但是,即使事务已提交(并且实例已从数据库中删除),实例对象仍保持不变。对其属性的任何更改都取决于您所做的操作

由于将实体标记为已删除,因此无法从数据库中刷新实例的状态(调用
EntityManager.refresh
method)。您将得到一个
IllegalArgumentException

请注意,在其他情况下,如果在记录所需内容之前刷新实体,则可能会出错

我引用了JPA规范(参见第节)中的一段文字,它可以帮助您理解“JPA”行为

与数据库的同步不涉及任何托管实体的刷新,除非根据cascade=refresh或cascade=ALL注释元素值的规定,在这些实体上显式调用了刷新操作或将其级联

这是JPA允许的操作吗

当您调用
remove
时,JPA(底层JPA提供程序)所做的只是“标记”该实例将被删除/删除。但是,即使事务已提交(并且实例已从数据库中删除),实例对象仍保持不变。对其属性的任何更改都取决于您所做的操作

由于将实体标记为已删除,因此无法从数据库中刷新实例的状态(调用
EntityManager.refresh
method)。您将得到一个
IllegalArgumentException

请注意,在其他情况下,如果在记录所需内容之前刷新实体,则可能会出错

我引用了JPA规范(参见第节)中的一段文字,它可以帮助您理解“JPA”行为

与数据库的同步不涉及任何托管实体的刷新,除非根据cascade=refresh或cascade=ALL注释元素值的规定,在这些实体上显式调用了刷新操作或将其级联


@Terrance我也有类似的想法,但我想继续努力。我最简单的解决方法是在操作之前输入日志,如果删除操作失败,则可能会输入错误的日志。下一个解决方法是在操作之前编写日志条目,直到删除成功后才将其发送到日志文件,但这对于我试图避免编写的代码来说是很笨拙的。@Terrance我也有类似的想法,但我希望继续这样做。我最简单的解决方法是在操作之前输入日志,如果删除操作失败,则可能会输入错误的日志。下一个解决方法是在操作之前编写日志条目,直到删除成功后才将其发送到日志文件,但这对于我试图避免的代码来说是很笨拙的。接下来的一个问题是:如果成员对象被延迟加载(并且还没有加载),这会是一个问题吗?这不是我的情况,但我很好奇JPA是如何工作的。你是说在
LinkRec
上调用
remove
之后?在您的情况下,您可以在提交事务之前通过
otherTable
关联获取它,而在事务提交之后则取决于底层持久性上下文是否没有销毁/处置itOne后续:如果成员对象是延迟加载的(并且还没有加载),这会是一个问题吗?这不是我的情况,但我很好奇JPA是如何工作的。你是说在
LinkRec
上调用
remove
之后?就你而言,