如何判断JPA EntityManager.merge是在进行插入还是更新

时间:2014-02-13 06:26:25

标签: java jpa eclipselink entitymanager

我正在使用带有EclipseLink的JPA并调用EntityManager.merge()来插入/更新数据库中的记录。记录来自外部系统,所以我无法分辨它们是新的还是现有的更新。

当我打电话给merge()时,有什么方法可以知道JPA正在执行什么样的操作(插入/更新)?

2 个答案:

答案 0 :(得分:1)

首先,这种行为对您来说是透明的,因此不会直接告诉您幕后合并的内容。

但是由于你没有提供合并操作的详细信息,我很难想象你有什么用例,你不知道你是否更新或插入。这方面的问题将是

  • 您使用的是生成的还是手动的ID?
  • 您使用的是版本列吗?
  • 您是在插入/更新单个实体还是子实体?

答案 1 :(得分:0)

我也想回答这个问题。

我可以想象很多情况,我需要检查对象是否存储新记录或现有记录的值。

为了缩短历史记录,我从外部源(文件,REST,等等)获取记录,我需要知道何时将业务验证应用于某种形式,并在每种情况下触发正确的操作。

在多个帖子中找到的默认解决方案是使用自动生成的id字段。

当我有一个自动生成的id时,我可以检查它的值是否为null(id在注册表的包含中自动初始化,并在从数据库中提取数据时返回填充)。但是当我没有自动生成的id时,或者当它是一个注册表包含但它的值被应用程序或外部源不正确地初始化时,这个逻辑不适用(失败了)。

我已经对数据库中的每个处理过的记录进行了查询,但这会导致不必要的读取次数。

另一种方法(需要更多测试)是在名为isNew的实体中创建瞬态属性。在构造函数中使用true值初始化,在@PostLoad方法中使用false。当记录是新的时,构造函数会将对象标记为isNew = true;当它被读取时,@ PostLoad将标记isN​​ew = false。

这可能是您的解决方案,也许有人可以告诉我们更好的方法来进行此验证。