java - @OneToMany 如果是集合的一部分则防止删除

标签 java hibernate jpql cuba-platform

我正在使用 Cuba Framework 和 Java JPQL

我有以下关系:

  1. Transaction_Sets
  2. Transactions

哪里

Transaction Entity
      @ManyToOne
        @JoinColumn(name = "TRANSACTION_SET_ID")
        @OnDelete(DeletePolicy.DENY)
        protected Transaction_Set transaction_Set;
Transaction_Set entity  
        @OneToMany(mappedBy = "transaction_Set", cascade = CascadeType.REMOVE)
        @OnDeleteInverse(DeletePolicy.DENY)
        protected List<Transaction> transactions;

我尝试了多种 @ 组合,但由于某种原因它不起作用。我想要它做的就是:

  1. Stop the deletion of a transaction if it belongs to a Transaction_Set.
    Whenever I try and delete the transaction it deletes it and removes it from the transaction_set.
  2. Delete all transactions of a transaction_set when the transacion_set is deleted.

数字 (2) 正在工作。第(1)号我无法解决...

过去一天我一直在为此烦恼。

我这样做对吗?我认为这可能与古巴框架的建立方式有关。

最佳答案

一个明显的设置如下:

// Transaction
@OnDelete(DeletePolicy.DENY)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TRANSACTION_SET_ID")
protected TransactionSet transactionSet;

// TransactionSet
@OnDelete(DeletePolicy.CASCADE) // won't work
@OneToMany(mappedBy = "transactionSet")
protected List<Transaction> transactions;

但是它不会起作用,因为您的要求是矛盾的:Transaction 上的 DENY 策略将阻止从 TransactionSet 端进行 CASCADE 删除。可能该问题无法在 ORM 级别上使用 @OnDelete@OnDeleteInverse 注解解决,但您可以在 AfterDeleteEntityListener 中实现限制之一当 ORM 完成其所有工作时运行。

因此映射应如下所示(仅保留第一个限制):

// Transaction
@OnDelete(DeletePolicy.DENY)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TRANSACTION_SET_ID")
protected TransactionSet transactionSet;

// TransactionSet
@OneToMany(mappedBy = "transactionSet")
protected List<Transaction> transactions;

以及实体监听器(不幸的是,您必须在此处使用纯 SQL):

package com.company.sample.listener;

import com.haulmont.bali.db.QueryRunner;
import com.haulmont.cuba.core.Persistence;
import com.haulmont.cuba.core.global.TimeSource;
import com.haulmont.cuba.core.global.UserSessionSource;
import com.haulmont.cuba.core.sys.persistence.DbTypeConverter;
import org.springframework.stereotype.Component;
import com.haulmont.cuba.core.listener.AfterDeleteEntityListener;
import java.sql.Connection;
import java.sql.SQLException;

import com.company.sample.entity.TransactionSet;

import javax.inject.Inject;

@Component("sample_TransactionSetEntityListener")
public class TransactionSetEntityListener implements AfterDeleteEntityListener<TransactionSet> {

    @Inject
    private TimeSource timeSource;

    @Inject
    private UserSessionSource userSessionSource;

    @Inject
    private Persistence persistence;

    @Override
    public void onAfterDelete(TransactionSet entity, Connection connection) {
        QueryRunner queryRunner = new QueryRunner();
        DbTypeConverter dbTypeConverter = persistence.getDbTypeConverter();
        try {
            queryRunner.update(connection,
                    "update SAMPLE_TRANSACTION set DELETE_TS = ?, DELETED_BY = ? where TRANSACTION_SET_ID = ?",
                    new Object[]{
                            dbTypeConverter.getSqlObject(timeSource.currentTimestamp()),
                            userSessionSource.getUserSession().getCurrentOrSubstitutedUser().getLoginLowerCase(),
                            dbTypeConverter.getSqlObject(entity.getId())
                    });
        } catch (SQLException e) {
            throw new RuntimeException("Error deleting related transactions ", e);
        }
    }
}

关于java - @OneToMany 如果是集合的一部分则防止删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127228/

相关文章:

java - 为其他开发人员设计类以在 Java 中使用

java - Hibernate insert or update datetime mysql always get 12 :00:00 or 00:00:00

hibernate - 你如何获得 "real"sql 与 hibernate 条件查询不同?

java - DAO方法中的事务回滚

java - 左连接两个与 JPQL 无关的表

java将字符串传递给文件编写器会使创建的文件变得困惑

java - 无法在 Eclipse 中调试 Mockito/JUnit 代码,仅适用于 JUnit

jpa - 为什么手动定义的 Spring Data JPA 删除查询不会触发级联?

sql - JPQL IN 子句 : Java-Arrays (or Lists, 设置...)?

java - java无限循环