如何在EJB-JPA tx中停止自动提交

时间:2018-12-20 14:13:43

标签: java jpa transactions ejb

我有一个无状态的EBJ,并且正在使用JPA来管理数据库交互。以下是我需要您帮助的情况。

  1. EJB收到了获取数据的调用(getCustomer())。
  2. GetCustomer用于使用JPA从数据库读取客户实体。
  3. 客户实体具有一种从属性中删除空格的方法。用@PostLoad注释。基本上,这会在持久性上下文中修改实体。

现在,当将响应发送到客户端时(在事务完成之后),它会向数据库触发更新SQL以更新数据集(在步骤3中进行了修改)。

如果可以看到此操作,则该操作本质上是只读的。但是由于我的数据有很多空间,因此我必须在实体对象中进行修剪。但是这种方法会触发意外的更新SQL。

请让我知道解决此问题的最佳方法,或如何隔离和同步EJB tx和JPA tx。

2 个答案:

答案 0 :(得分:0)

您可以声明getCustomer()不支持事务:

$(document).ready(function() {
  var begin = 720;
  $("#yett").val("Total €" + begin.toFixed(2).replace(/\./g, ","));

  var target = document.querySelector("#CalculatorPlacing");
  var observer = new MutationObserver(function(mutations) {
    checked = mutations[0].target.checked;
    var prev = $("#yett")
      .val()
      .split("€")[1];
    if (checked === true) {
      total = begin - 300;
      $("#yett").val("Total €" + total.toFixed(2).replace(/\./g, ","));
    } else {
      $("#yett").val("Total €" + begin.toFixed(2).replace(/\./g, ","));
    }
  });
  var config = { attributes: true };
  observer.observe(target, config);

  $("#CalculatorPlacing").on("change", function() {
    var prev = $("#yett")
      .val()
      .split("€")[1];
    if ($(this).prop("checked") == true) {
      total = begin - 300;
      $("#yett").val("Total €" + total.toFixed(2).replace(/\./g, ","));
    } else {
      $("#yett").val("Total €" + begin.toFixed(2).replace(/\./g, ","));
    }
  });

  $("#CalculatorTransport").change(function() {
    if ($("#CalculatorTransport").is(":checked") == true) {
      // off
      $("#CalculatorPlacing").attr("disabled", true);
      $("#CalculatorPlacing").prop("checked", true);
    }
  });
});

在Java EE教程中了解有关事务的更多信息: https://docs.oracle.com/javaee/7/tutorial/transactions003.htm

答案 1 :(得分:0)

不必为了满足您的要求而烦恼交易管理。

您的代码应在从DAO返回之前调用javax.persistence.EntityManager.clear()。这将使您的实体bean与持久性上下文分离,持久性上下文将不再对其进行跟踪。来自Java文档:

  

清除持久性上下文,导致所有被管理实体分离。对尚未刷新到数据库的实体所做的更改将不会保留。