【问题标题】:Multiple calls to the same JPA model overwriting the object对同一 JPA 模型的多次调用会覆盖对象
【发布时间】:2013-01-28 16:35:27
【问题描述】:

我有一个 Play Framework(1.2.5)/JPA 代码,如下所示:

List<MyObject> nL = MyObject.find("uuid", SubscriptionReferrer).fetch();
MyObject n = nL.get(0);
n.subscriptions.add(SubscriptionReference);
n.save();
JPA.em().flush();
JPA.em().getTransaction().commit();

因为它是在控制器领域之外调用的,所以我要求 JPA 写入记录。无论如何,基本上有人订阅了一个产品,这个方法被调用了。但他们也可以同时订阅多个产品,从而创建对该方法的多个单独调用。

我似乎遇到的问题是,当调用并行运行时,

List<MyObject> nL = MyObject.find("uuid", SubscriptionReferrer).fetch();
MyObject n = nL.get(0);

bit 被调用并返回对象,但该对象对所有调用都是独立的,并且当保存提交时,最后一个对象获胜,并且所有其他对象都被覆盖。

==编辑== 另外,我不知道会通过多少订阅,因为它来自第三方支付提供商。

那么,有没有一种明智的方法可以让我在不编写额外缓存层的情况下保存对对象的所有更新?

谢谢

汤姆

【问题讨论】:

  • 您希望它如何工作?如果一个人更新名称,另一个人将其更新为不同的值,那么总会有赢家和输家,所有更改都可能基于他们没有看到的先前更改的陈旧数据。如果不同线程同时更新同一个对象并不常见,我建议您实现乐观锁定并处理异常。否则,您可能需要某种形式的悲观锁定来同步数据读取和写入。

标签: java jpa playframework persistence


【解决方案1】:

您可以“同步”您的方法,这将确保以原子方式获取和更新对象。在 JPA 中使用事务也可以。

【讨论】:

【解决方案2】:

糟糕的设计!

睡在上面,然后意识到,尽管它只是一堆字符串,但创建订阅模型并通过连接回主对象来持久化它们要容易得多。

谢谢大家。

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 2021-06-07
    • 2023-03-03
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2020-06-07
    相关资源
    最近更新 更多