gpt4 book ai didi

java - H2 嵌入式数据库外键和引用

转载 作者:搜寻专家 更新时间:2023-10-30 23:26:03 24 4
gpt4 key购买 nike

因此,我有一项作业需要实现两个实体 - 账户和交易进一步我需要能够在两个账户之间创建交易(场景:只涉及 2 个账户)

我还需要找出 Transaction 表的结构,希望对 Transaction 表创建脚本有帮助。

我的问题是:我需要找出如何引用这两个表之间的外键和关系,因为现在我有点不清楚。

接下来是逻辑:我在想,也许是一个Account会有两个 List<Transaction>如:

private List<Transaction> transactionsMade; 
private List<Transaction> transactionsReceived.

因此:在 Transaction类将是:

@ManyToOne引用 transactionMadeList

private Account emitter; 

@ManyToOne引用 transactionReceivedList

private Account receptor;

这是我的类(class)

账户类

public class Account {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
private String holder;

@NotNull
private Integer balance;

@OneToMany(mappedBy = "emitter",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<Transaction> transactionsMade;

@OneToMany(mappedBy = "receptor",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<Transaction> transactionsReceived;

}

事务类

public class Transaction {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
private Integer amount;

@NotNull
private LocalDateTime created;

@ManyToOne
@JoinColumn(name = "transactionEmitter")
private Account emitter;

@ManyToOne
@JoinColumn(name = "transactionReceptor")
private Account receptor;

public Transaction(Integer amount, Account emitter, Account receptor){
this.created = LocalDateTime.now();
this.amount = amount;
this.emitter = emitter;
this.receptor = receptor;
}

}

现在就是这样。

提前谢谢您! :)

最佳答案

您的思考方向是正确的。您的架构如下所示: database schema

我注意到只有两件事你可以做得更好:

1) Use Instant instead of LocalDateTime, so it will be stored in UTC time.

改变这个:

private LocalDateTime created;

对此:

private Instant created;

2) Do not use EAGER initialization:

@OneToMany(mappedBy = "emitter",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<Transaction> transactionsMade;

@OneToMany(mappedBy = "receptor",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<Transaction> transactionsReceived;

会变成这样:

@OneToMany(mappedBy = "emitter",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private List<Transaction> transactionsMade;

@OneToMany(mappedBy = "receptor",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private List<Transaction> transactionsReceived;

如果您遇到著名的 LazyInitializationException,请尝试将其包裹在 @Transactional 中。这可能会使事情变得有点复杂,但是,从长远来看,将为您节省一些服务器资源,因为您不会在甚至不需要时加载所有帐户的交易。

3) Create a repository to modularize your functionality, just like this one:

@Repository
public interface TransactionRepository extends JpaRepository<Transaction, Long> {
Collection<Transaction> findAllByEmitter(Account emitter);
Collection<Transaction> findAllByReceptor(Account receptor);
}

关于java - H2 嵌入式数据库外键和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57715399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com