【问题标题】:Controller method persistence issue控制器方法持久性问题
【发布时间】:2019-09-01 13:47:29
【问题描述】:

我有以下场景:两个实体 - TransactionAccount 交易只涉及两个账户。

创建交易后,accountSender 的金额减少,而 accountReceiver 的金额增加。

Account 实体拥有两个列表 - transactionsMadeListtransactionsReceivedList,所以总的来说它看起来像这样:

[
    {
        "id": 1,
        "holder": "Pavel S",
        "balance": -950,
        "transactionsMade": [
            {
                "id": 1,
                "amount": 50,
                "created": "2019-09-01T13:37:24.565579Z",
                "senderAccountId": 1,
                "receiverAccountId": 2
            },
            {
                "id": 3,
                "amount": 35,
                "created": "2019-09-01T13:37:24.614450Z",
                "senderAccountId": 1,
                "receiverAccountId": 2
            }
        ],
        "transactionsReceived": [
            {
                "id": 2,
                "amount": 50,
                "created": "2019-09-01T13:37:24.609462Z",
                "senderAccountId": 2,
                "receiverAccountId": 1
            }
        ]
    },
    {
        "id": 2,
        "holder": "Gustaf S",
        "balance": 1070,
        "transactionsMade": [
            {
                "id": 2,
                "amount": 50,
                "created": "2019-09-01T13:37:24.609462Z",
                "senderAccountId": 2,
                "receiverAccountId": 1
            }
        ],
        "transactionsReceived": [
            {
                "id": 1,
                "amount": 50,
                "created": "2019-09-01T13:37:24.565579Z",
                "senderAccountId": 1,
                "receiverAccountId": 2
            },
            {
                "id": 3,
                "amount": 35,
                "created": "2019-09-01T13:37:24.614450Z",
                "senderAccountId": 1,
                "receiverAccountId": 2
            }
        ]
    }
]

我实现了Controller 方法[POST],它创建了一个事务。 代码如下:

@Transactional
    @PostMapping("/transactions")
    public ResponseEntity<Transaction> createTransaction(@Valid @RequestBody Transaction transaction) {
        final Transaction result = transactionRepository.save(transaction);
        final URI location = ServletUriComponentsBuilder.fromCurrentRequest().
                path("/{id}")
                .buildAndExpand(result.getId()).toUri();
        Account sender = accountRepository.findById(result.getSenderAccountId()).get();
        Account receiver = accountRepository.findById(result.getReceiverAccountId()).get();
        Transaction tr = transactionRepository.findById(result.getId()).get();
        Integer emitterBalance = accountRepository.findById(result.getSenderAccountId()).get().getBalance();
        Integer receptorBalance = accountRepository.findById(result.getReceiverAccountId()).get().getBalance();
        Integer amount = tr.getAmount();
        Integer emitterFinalBalance = emitterBalance - amount;
        Integer receptorFinalBalance = receptorBalance + amount;


        sender.setBalance(emitterFinalBalance);
        accountRepository.save(sender);

        receiver.setBalance(receptorFinalBalance);
        accountRepository.save(receiver);

        transactionRepository.save(result);
        transactionRepository.save(tr);
        return ResponseEntity.created(location).build();
    }

我的问题是:当我将数据从 CommandLineRunner 间接静态变量保存到数据库时 - 事务对象被保存,然后显示在 transactionsMadeList/transactionsReceivedList 中,也可以通过以下方式找到[GET] ~/transactions方法 但是当我尝试通过[POST] ~/transactions 方法创建Transaction 时,Transaction 正在创建但没有被添加到transactionsMade/transactionsReceived lists

感谢任何帮助,因为我现在对此有点支持:/ 似乎问题出在 Controller 方法中的持久部分 如果您需要实体类,请告诉我我也会发布它们

【问题讨论】:

    标签: java spring hibernate rest


    【解决方案1】:

    您应该将交易添加到帐户中。 (删除映射) 请尝试以下操作:

    帐户类别更改

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    private List<Transaction> transactionsMade = new ArrayList<>();
    
    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    private List<Transaction> transactionsReceived = new ArrayList<>();
    

    控制器:

    @Transactional
    @PostMapping("/transactions")
    public ResponseEntity<Transaction> createTransaction(@Valid @RequestBody Transaction transaction) {
        final Transaction storedTransaction = transactionRepository.save(transaction);
        final URI location = ServletUriComponentsBuilder.fromCurrentRequest().
                path("/{id}")
                .buildAndExpand(storedTransaction.getId()).toUri();
        Account sender = accountRepository.findById(storedTransaction.getSenderAccountId()).get();
        Account receiver = accountRepository.findById(storedTransaction.getReceiverAccountId()).get();
        Integer emitterBalance = accountRepository.findById(storedTransaction.getSenderAccountId()).get().getBalance();
        Integer receptorBalance = accountRepository.findById(storedTransaction.getReceiverAccountId()).get().getBalance();
        Integer amount = storedTransaction.getAmount();
        Integer emitterFinalBalance = emitterBalance - amount;
        Integer receptorFinalBalance = receptorBalance + amount;
    
        sender.setBalance(emitterFinalBalance);
        sender.getTransactionsMade().add(storedTransaction);
        accountRepository.save(sender);
    
        receiver.setBalance(receptorFinalBalance);
        receiver.getTransactionsReceived().add(storedTransaction);
        accountRepository.save(receiver);
    
        return ResponseEntity.created(location).build();
    }
    

    【讨论】:

    • 现在我收到此错误消息:找到对集合的共享引用:com.monese.homework.model.entity.Account.transactionsReceived;嵌套异常是 org.hibernate.HibernateException:找到对集合的共享引用:com.monese.homework.model.entity.Account.transactionsReceived",
    • 你能试试新版本吗? :)(我们需要更改帐户)
    • 同样的问题:“找到对集合的共享引用:com.monese.homework.model.entity.Account.transactionsReceived;嵌套异常是 org.hibernate.HibernateException:找到对集合的共享引用:com .monese.homework.model.entity.Account.transactionsReceived"
    • 我已经完成了重构(冗余的 save(...) 调用已被删除)。别担心,我们会解决这个问题:)。这种重构有助于我们做到这一点。请尝试运行它。
    • 现在正在创建交易,但交易仍未添加到 transactionsReceived/Made 列表中:(顺便说一句,我们可以转到聊天 :)非常感谢帮助我解决这个问题:@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2013-05-10
    相关资源
    最近更新 更多