是否可以引用已删除的JPA实体?
我有一个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中允许的操作吗?规范中的相关行是: 删除实体后,其状态(生
@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
之后?就你而言,