小编Iva*_*der的帖子

JPA混淆(托管与非托管实体)

我正在研究一个网络项目,试图了解一遍又一遍地做这种事情的最佳方法:

  • 从DB中读取对象A.
  • 稍后,阅读另一个对象(B)
  • 在DB中更改AB(作为事务的一部分 - 写入所有更改或不写入)

老式的JDBC类型方式不是问题,但JPA正在努力.

我需要在那里明确划分数据库更改发生的位置,并且根据我的观察,对管理实体的任何更改都将在下次EntityManager.commit()调用时被修改(无论事务是否在更改之前明确开始) ).正确?

那么确保所有实体永远不会被管理并且总是更好merge()吗?

我发现自己必须在这两个例子中做出决定:

RepaintAction1

User user = getUser(); //non-managed entity
Car car = getCar(123); //non-managed

car.setColor("Red");
user.setLog("Paints car red");

dao.update(car, user);
Run Code Online (Sandbox Code Playgroud)

RepaintDAO1

entityTransaction.begin();
entityManager.merge(car);
entityManager.merge(user);
entityTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

要么:

RepaintAction2(这与RepaintAction1相同,但与托管实体相同)

User user = getUser(); //managed entity
Car car = getCar(123); //managed

car.setColor("Red");
user.setLog("Paints car red");

dao.update(car, user);
Run Code Online (Sandbox Code Playgroud)

RepaintDAO2

entityTransaction.begin();
entityManager.flush();
entityTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

第一个我不介意,但我必须忽略管理实体的一些优势(哪些?).在第二个我不喜欢交易范围不明确的方式(以及如何处理回滚?).

但这些是唯一的选择(例如,有没有办法使用托管实体明确划分交易)?处理这个问题的最佳方法是什么?

我为这么做而道歉,但是我经历了很多没有帮助的文档,我甚至不确定我所观察到的是正确的.

dao jpa transactions java-ee

8
推荐指数
1
解决办法
7101
查看次数

标签 统计

dao ×1

java-ee ×1

jpa ×1

transactions ×1