Java Quarkus Panache (Hibernate) 不更新实体 属性
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();
}
}
还有我的 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;
}
当我登录时,函数调用后,所有用户及其硬币数量表明硬币已为正确的人更新:
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();
}
然后returns未更新的旧余额。
有谁知道为什么我无法更新余额?
- 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;
}
由于实体处于托管状态,因此提交事务后更改将传播到数据库。
我觉得不如写
Psu.persist(psuSender);
你应该写
psuSender.persist();
在编写代码时,我不小心删除了@Inject...
但是,Quarkus 没有给我任何错误或其他信息。
注入 psuService 后 class 一切正常。
我有一个 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();
}
}
还有我的 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;
}
当我登录时,函数调用后,所有用户及其硬币数量表明硬币已为正确的人更新:
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();
}
然后returns未更新的旧余额。
有谁知道为什么我无法更新余额?
- 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;
}
由于实体处于托管状态,因此提交事务后更改将传播到数据库。
我觉得不如写
Psu.persist(psuSender);
你应该写
psuSender.persist();
在编写代码时,我不小心删除了@Inject...
但是,Quarkus 没有给我任何错误或其他信息。
注入 psuService 后 class 一切正常。