Java 银行数据库:关系的正确定义?

Java 银行数据库:关系的正确定义?,java,hibernate,jpa,Java,Hibernate,Jpa,我正在用Spring Boot和Spring Data JPA构建一个银行应用程序,在其中定义BankAccount类与BankTransfer类之间的关系时遇到了一些问题,我无法找到解决方案。银行账户有一个转账列表列表转账。所以这里的关系被定义为@OneToMany。但在每一笔银行转账中,我都有两个银行账户,分别称为“发送方”和“接收方”。发送方是从中提取金额的账户,接收方是添加金额的账户 因此,每个银行转账都必须与BankAccount类具有@ManyToOne关系(该关系正好是二对一关系)

我正在用Spring Boot和Spring Data JPA构建一个银行应用程序,在其中定义BankAccount类与BankTransfer类之间的关系时遇到了一些问题,我无法找到解决方案。银行账户有一个转账列表
列表转账
。所以这里的关系被定义为@OneToMany。但在每一笔银行转账中,我都有两个银行账户,分别称为“发送方”和“接收方”。发送方是从中提取金额的账户,接收方是添加金额的账户

因此,每个银行转账都必须与BankAccount类具有@ManyToOne关系(该关系正好是二对一关系)。因此,这里的困难在于如何映射两个银行帐户(发送方和接收方)?在BankAccount类的@OneToMany注释中将什么设置为mappedBy字段

以下是我的课程:

银行账户类别:

@Entity
@Table(name = "bank_account")
public class BankAccount {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "account_Sequence")
    @SequenceGenerator(name = "account_Sequeence", sequenceName = "BANK_ACCOUNT_SEQ")
    @Column(name ="id")
    private Long id;

    @NotNull
    @Column(name ="account_number")
    private String accountNumber;

    @NotNull
    @Enumerated
    @Column(name ="type")
    private AccountType type;

    @Column(name ="currency")
    private Currency currency;

    @NotNull
    @Column(name ="balance")
    private BigDecimal balance;

    @NotNull
    @Column(name ="date_created")
    protected Date dateCreated;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE,
                          CascadeType.DETACH, CascadeType.REFRESH})
    @JoinColumn(name="client_id")
    protected Client client;

    @Column(name ="employee_id")
    private Employee accountManager;

    @OneToMany(fetch = FetchType.LAZY,
               mappedBy = "sender",
               cascade = {CascadeType.PERSIST, CascadeType.MERGE,
                          CascadeType.DETACH, CascadeType.REFRESH})
    protected List<BankTransfer> transfers;
}
如你所见,我有:

@OneToMany(fetch = FetchType.LAZY,
                   mappedBy = "sender",
                   cascade = {CascadeType.PERSIST, CascadeType.MERGE,
                              CascadeType.DETACH, CascadeType.REFRESH})
protected List<BankTransfer> transfers;
我还想映射BankTransfer类中的
BankAccountReceiver
字段。例如,我试过:

mappedBy = {"sender", "receiver"},
或者尝试添加2@OneToMany注释,但这些似乎是错误的


你能帮我解决这个问题吗。也许我需要以某种方式分别重新定义实体和oracle数据库表。我对RDBMS比较陌生,我构建这个应用程序是为了获得更多的经验。

这取决于您如何填充这些实体上的数据。 如果创建新数据库,则可以创建
联接表
并使用
@OneToMany


通常在像您这样的情况下,我只在
银行转账
端使用关联,因此您可以从
银行账户
中删除转账,尤其是您有延迟关系。从实体
银行账户转账
您可以通过sql、jpa等实现。您不需要实体中的字段

您需要将转账分为ReceivedTransfer和SendTransfer。关系可以是单向的,双向的不受欢迎。谢谢您,我按照您的建议做了-只在银行转账上使用了关系,效果很好。
@NotNull
@ManyToOne(targetEntity = BankAccount.class,
           fetch = FetchType.LAZY,
           cascade = {CascadeType.PERSIST, CascadeType.MERGE,
                           CascadeType.DETACH, CascadeType.REFRESH})
@JoinColumn(name = "sender_id")
private BankAccount sender;
mappedBy = {"sender", "receiver"},