![](/img/trans.png)
[英]Quarkus Panache Hibernate: How to clear the cache, make entity world match the database state?
[英]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();
}
然后它返回未更新的舊余額。
有誰知道為什么我不能更新余額?
編輯進行更新時:
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.