You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

钱包余额计算逻辑错误与walletBalance非空约束异常问题

钱包功能问题解决方案

1. 余额计算逻辑错误修复

问题核心是每次收支操作都基于initialBalance计算余额,而非当前钱包的实时余额,同时原代码未将更新后的余额持久化到数据库。

修复后的收支方法代码

支出方法

@Override
public void saveExpense(Transaction transaction, Long walletId, Long userId) {
    Wallet wallet = walletService.getWalletById(walletId);

    double amount = transaction.getAmount();
    // 基于当前walletBalance计算新余额,替换原initialBalance的依赖
    wallet.setWalletBalance(wallet.getWalletBalance() - amount);
    System.out.println("Wallet balance after expense " + wallet.getWalletBalance());

    transaction.setTransactionType(TransactionType.EXPENSE);
    // 新增:将更新后的钱包信息保存到数据库
    walletService.saveWallet(wallet);
    this.transactionRepository.save(transaction);
}

收入方法

@Override
public void saveIncome(Transaction transaction, Long walletId, Long userId) {
    Wallet wallet = walletService.getWalletById(walletId);

    double amount = transaction.getAmount();
    // 基于当前walletBalance计算新余额,替换原initialBalance的依赖
    wallet.setWalletBalance(wallet.getWalletBalance() + amount);
    System.out.println("Wallet balance after income " + wallet.getWalletBalance());

    transaction.setTransactionType(TransactionType.INCOME);
    // 新增:将更新后的钱包信息保存到数据库
    walletService.saveWallet(wallet);
    this.transactionRepository.save(transaction);
}

关键说明

  • 替换计算基准:从依赖initialBalance改为依赖当前walletBalance,保证多次收支后余额累计正确。
  • 持久化余额更新:必须调用walletService.saveWallet(wallet),否则钱包余额的修改不会同步到数据库。

2. 创建钱包时非空约束异常修复

问题原因是创建钱包时walletBalance字段未赋值,违反数据库非空约束,需要在初始化钱包时为该字段设置值。

修复方案

方案一:实体类初始化+业务逻辑赋值

  1. 修改Wallet实体,给walletBalance设置默认初始值:
public class Wallet {
    // ...其他字段
    // 添加默认值初始化
    private double walletBalance = 0.0;
    // ...其他字段
}
  1. 在创建钱包的业务逻辑中,将walletBalance初始化为initialBalance的值:
// 示例创建钱包代码(根据实际业务调整)
public Wallet createWallet(Wallet wallet, Long userId) {
    wallet.setUserId(userId);
    // 初始化实时余额为初始余额
    wallet.setWalletBalance(wallet.getInitialBalance());
    return walletRepository.save(wallet);
}

方案二:数据库层面设置默认值

如果允许修改数据库结构,可以给wallet_balance字段添加非空默认值:

ALTER TABLE wallet MODIFY COLUMN wallet_balance DOUBLE NOT NULL DEFAULT 0.0;

注意:数据库默认值仅作为兜底,仍建议在业务代码中显式初始化walletBalance为initialBalance,保证业务逻辑与数据库状态一致。

额外优化建议

  • 金额类型替换:避免使用double处理金额(存在精度丢失风险),建议将initialBalance、walletBalance及Transaction中的amount字段改为BigDecimal类型。
  • 事务管理:给收支操作添加@Transactional注解,确保钱包余额更新和交易记录保存的原子性,防止数据不一致。

内容的提问来源于stack exchange,提问作者koderkodo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:42:10