簡體   English   中英

Java Quarkus Panache(休眠)不更新實體屬性

[英]Java Quarkus Panache (Hibernate) doesn't update entity property

我有一個 PSU 實體:

@Entity
public class Psu extends PanacheEntityBase {
    @Id
    @GeneratedValue
    public UUID uuid;

    @Column(nullable = false, length = 50)
    public String username;
    public Integer coins;
    public String firebaseRegistrationToken;

    public void setCoins(int coins){
        this.coins = coins;
    }

    public int getCoins(){
        return coins;
    }

    public static Psu findByUsername(String username){
        return find("username", username).firstResult();
    }
} 

還有一個 function 在我的 PsuService class 中:

@Transactional
public Transaction changeBalance(Transaction transaction){
    Psu psuSender = Psu.findById(transaction.senderId);
    psuSender.coins = psuSender.coins - transaction.amount;
    Psu.persist(psuSender);

    transaction.status = TransactionStatus.PROCESSED;

    return transaction;
}

當我登錄時,在 function 調用之后,所有用戶及其硬幣數量都顯示硬幣已為正確的人更新:

List<Psu> allPsu = Psu.findAll().list();
for(Psu psu : allPsu){
    System.out.println("ID: " + psu.uuid + " coins: " + psu.coins);
}

當我通過 API 檢索更新用戶的余額時:

@GET
@Path("psu/getBalance/{uuid}")
@Produces(MediaType.APPLICATION_JSON)
public String getBalanceById(@PathParam("uuid") UUID uuid) {
    List<Psu> allPsu = Psu.findAll().list();
    for(Psu psu : allPsu){
        System.out.println("ID: " + psu.uuid + " coins: " + psu.coins);
    }

    return gson.toJson(psuService.getBalanceById(uuid));
}

在 PsuService class 中使用此方法:

@Transactional
public int getBalanceById(UUID uuid){
    Psu psu = Psu.findById(uuid);
    return psu.getCoins();
}

然后它返回未更新的舊余額。

有誰知道為什么我不能更新余額?

  • PsuService 擴展了 PanacheEntityBase
  • PsuService 是 @ApplicationScoped

編輯進行更新時:

Psu.update("coins = ?1 where id= ?2", 10, transaction.senderId);

我收到錯誤:

ERROR [io.qua.sch.run.SimpleScheduler] (executor-thread-1) Error occured while executing task for trigger IntervalTrigger [id=1_com.msp.sqs.MessageQueue_ScheduledInvoker_receiveMessages_e721e20dd5fdaa8a94c141
a7768b0311d6f32352, interval=1000]: javax.persistence.TransactionRequiredException: Executing an update/delete query

我認為它沒有更新,因為您正在對現有實體使用persist化。 由於實體是托管且存在的,因此您可以通過以下方式更改代碼:

@Transactional
public Transaction changeBalance(Transaction transaction){
    Psu psuSender = Psu.findById(transaction.senderId);
    psuSender.coins = psuSender.coins - transaction.amount;
    // Psu.persist(psuSender); <-- Remove this

    transaction.status = TransactionStatus.PROCESSED;
    return transaction;
}

提交事務時,更改將傳播到數據庫,因為實體位於托管 state 中。

我認為而不是寫作

Psu.persist(psuSender);

你應該寫

psuSender.persist();

在編寫代碼時,我不小心刪除了@Inject ...

但是,Quarkus 並沒有給我任何錯誤或什么。

注入 psuService class 后一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM