Есть две таблицы Transaction
и TxTargets
, их сущности выглядят следующим образом:
Transaction.java:
@Entity
public class Transaction {
@Id
@GeneratedValue
private Long id;
private BigDecimal amount;
@OneToMany(cascade= CascadeType.ALL, fetch = FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
@JoinColumn(name = "tx_id")
@IndexColumn(name="idx")
private List<TxTargets> txTargets;
}
TxTargets.java
@Entity
public class TransactionAllocation {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private TargetType type;
private BigDecimal amount;
}
Мне нужно удалить объекты TxTarget с 0 значениями из коллекции, где имеется более одного элемента с одинаковым tx_id.Я не могу удалить их прямо из TxTarget из-за отношения OneToMany и @ IndexColumn.
Чтобы понять, как могут выглядеть данные, вот пример этого:
Transaction:
id|amount|txTargets
1 200 [1,2]
2 100 [3]
3 300 [4,5,6]
TxTargets
id|type|amount|idx|tx_id
1 tp1 200 0 1
2 tp1 0 1 1
3 tp2 100 0 2
4 tp2 150 0 3
5 tp2 0 1 3
6 tp2 150 2 3
TxTargets with ids 2 and 5 are expected to be deleted.
Нав тот момент, когда я удаляю их следующим образом:
1) Извлекаем идентификаторы всех сущностей TxTarget с 0 значениями с «имеющим count (tx_id)> 1».
2) Извлекаем все сущности транзакциикоторые имеют TxTargets из (1).
3) Удалить объекты TxTarget из коллекции в соответствии со списком идентификаторов из (1)
4) Персистентная транзакция.
Thisкак это работает правильно, но я думаю, что ему не хватает производительности (по крайней мере, несколько итераций сбора) и в целом есть избыточные действия.
Я хотел бы знать, есть ли лучшие подходы для удаления таких объектов и каковы они