我想用一个查询从三个表中删除相关数据。我收到错误消息:javax.persistence.TransactionRequiredException:执行更新/删除查询

我们使用Java 8,Hibernate ORM 5.4.0和MySQL。当然,我已经看过这里了,但是找不到适合我问题的答案。 @Transactional无法帮我作为类或方法的名称符号。

这是我删除方法的样子:

public void delteAllAccountsAndValues(Long accountIdToDelete) {
        try {
            startOperation(false);
            getSession().createQuery("DELETE FROM AccountEntity WHERE accountId = :accountIdToDelete")
                    .setParameter("accountIdToDelete", accountIdToDelete)
                    .executeUpdate();
            List accountLineIdsToDelete =
                    getSession()
                            .createQuery("SELECT ale.accountlineId FROM AccountlineEntity ale WHERE ale.accountId IN :accountIdToDelete")
                            .setParameter("accountIdToDelete", accountIdToDelete)
                            .list();
            getSession().createQuery("DELETE FROM AccountlineEntity WHERE accountlineId = :accountLineIdsToDelete")
                    .setParameter("accountLineIdsToDelete", accountLineIdsToDelete)
                    .executeUpdate();
            List accountLineValuesIdsToDelete =
                    getSession().createQuery("SELECT alve.accountlinevaluesId FROM AccountlinevaluesEntity alve WHERE" +
                            " alve.accountlineId IN :accountLineIdsToDelete")
                            .setParameter("accountLineIdsToDelete", accountLineIdsToDelete)
                            .list();
            getSession().createQuery("DELETE FROM AccountlinevaluesEntity WHERE accountlinevaluesId = : accountLineValuesIdsToDelete")
                    .setParameter("accountLineValuesIdsToDelete", accountLineValuesIdsToDelete)
                    .executeUpdate();
        } catch (HibernateException e) {
            handleException(e);
        } finally {
            getSession().close();
        }
    }




我的BaseManager类的一部分:



  void startOperation(boolean openTransaction) throws HibernateException {
    this.session = HibernateUtil.getSessionFactory().openSession();
    if (openTransaction) {
      this.tx = session.beginTransaction();
    }
  }

  void handleException(HibernateException e) {
    System.out.println(e.getMessage());
    if (e.getCause() != null) {
      System.out.println(e.getCause().getMessage());
    }
    if (this.tx != null) {
      this.tx.rollback();
    }
  }

  protected Session getSession() {
    return session;
  }

  protected void setSession(Session session) {
    this.session = session;
  }

  protected Transaction getTx() {
    return tx;
  }

  protected void setTx(Transaction tx) {
    this.tx = tx;
  }

  public UserEntity getCurrentUser() {
    return currentUser;
  }

  public void setCurrentUser(UserEntity currentUser) {
    this.currentUser = currentUser;
  }


这些实体在构造上都是相同的,因此我的实体示例之一:

@Entity
@Table(name = "account")
public class AccountEntity {
    @Expose() private Long accountId;
    private String sourcedata;
    private Timestamp dateCreated;
    private Integer parentId;
    @Expose() private MandantEntity mandantEntity;
    @Expose() private UserEntity userEntity;


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "account_id", nullable = false)
    public Long getAccountId() {
        return accountId;
    }

    public void setAccountId(Long accountNewId) {
        this.accountId = accountNewId;
    }

    @Basic
    @Column(name = "sourcedata", nullable = false)
    public String getSourcedata() {
        return sourcedata;
    }

    public void setSourcedata(String sourcedata) {
        this.sourcedata = sourcedata;
    }

    @Basic
    @CreationTimestamp
    @Column(name = "date_created")
    public Timestamp getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Timestamp dateCreated) {
        this.dateCreated = dateCreated;
    }

    @Basic
    @Column(name = "parent_id")
    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

   ...





现在,我无法再进一步了。有谁知道问题可能在哪里?

最佳答案

1)您不要通过在此处传递false来打开交易:

startOperation(false);


2)在finally块或try块结束之前,您必须提交它:

    } finally {
        getTx().commit();
        getSession().close();
    }

09-15 21:42