Сопоставить сущность на основе одного из двух разных атрибутов (одного или другого) - PullRequest
0 голосов
/ 30 марта 2020

Я занимаюсь разработкой веб-приложения с использованием Java, Spring и JPA. Вариант использования, который я хотел бы обсудить с вами, довольно прост, он состоит только из двух сущностей, Wallet и Transaction. В частности, Wallet может иметь два вида транзакций: входящие и исходящие . Давайте посмотрим на структуру этих двух классов.

@Entity
public class Wallet{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long walletId;

    @OneToMany(mappedBy="fromWallet", orphanRemoval = true)
    private List<Transaction> outgoingTransactions;

    @OneToMany(mappedBy="toWallet", orphanRemoval = true)
    private List<Transaction> incomingTransactions;

    ....
}


public class Transaction{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long transactionId;

    @ManyToOne
    @JoinColumn(name = "wallet_id_from")
    private Wallet fromWallet;

    @ManyToOne
    @JoinColumn(name = "to_wallet_id")
    private Wallet toWallet;

    ....
}

Вот так выглядит мой код прямо сейчас, и он отлично работает. У меня вопрос: как я могу изменить код, чтобы вместо двух разных списков у меня был только один для входящих и исходящих транзакций? Так что я хотел бы что-то вроде этого:

@Entity
public class Wallet{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long walletId;

    @OneToMany(mappedBy="{'fromWallet' or 'toWallet'}", orphanRemoval = true)
    private List<Transaction> transactions;

    ....
}

Можно ли сделать что-то подобное? Или я должен придерживаться текущего решения (два разных списка)?

1 Ответ

0 голосов
/ 30 марта 2020

Я не думаю, что описываемая вами ситуация может быть достигнута с помощью инструментов JPA, но вы, конечно, можете сделать что-то вроде

  1. Модифицировать свою базу данных и объединить оба столбца соединения, чтобы вы в конечном итоге с "классическими" отношениями OneToMany с обратной стороной, что вы потеряли информацию, если кошелек был from или to.
  2. Создайте метод getTransactions в Wallet, который просто возвращает объединенный неизменный список outgoingTransactions и incomingTransactions без обратной стороны 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...