gpt4 book ai didi

java - 使用Hibernate merge() 和refresh()

转载 作者:行者123 更新时间:2023-12-01 11:19:55 25 4
gpt4 key购买 nike

我有一个表,我想在按下删除按钮时将映射表的状态字段从 1 更改为 0。这是逻辑。

这是我的映射表

@Entity
@Table(name = "POSITION_ACCOUNT")
public class PositionAccount {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID", columnDefinition = "NUMERIC(15, 0)",unique = true,nullable = false)
private Long id;
public Long getId() {
return id;
}

@Column(name = "ACCT_NUMBER")
private String accountNumber;
public String getAccountNumber() { return accountNumber; }

@Column(name = "ACCT_NAME")
private String accountName;
public String getAccountName() {
return accountName;
}

@Column(name = "CURRENCY_CODE")
private String currencyCode;
public String getCurrencyCode() {
return currencyCode;
}

@Column(name = "BALANCE")
private BigDecimal balance = new BigDecimal("0");

public BigDecimal getBalance() {
return balance;
}

@Column(name = "ACCT_TYPE")
private String accountType;
public String getAccountType() { return accountType; }

@Column(name = "STATE")
private int state = 1;
public int getState() {
return state;
}

public void setId(Long id) {
this.id = id;
}

public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}

public void setAccountName(String accountName) {
this.accountName = accountName;
}

public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}

public void setBalance(BigDecimal balance) {
this.balance = balance;
}

public void setState(int state) {
this.state = state;
}

public void setAccountType(String accountType) { this.accountType = accountType; }

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

PositionAccount that = (PositionAccount) o;

return !(id != null ? !id.equals(that.id) : that.id != null);

}

@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}

@Override
public String toString() {
return "PositionAccount{" +
"id=" + id +
", accountNumber='" + accountNumber + '\'' +
", accountName='" + accountName + '\'' +
", currencyCode='" + currencyCode + '\'' +
", balance=" + balance +
", state=" + state +
'}';
}
}

这是我的@ActionMethod

@Inject
private LoroNostroService service;
@Inject
private LoroNostroModel model;
@ActionMethod(ACTION_DELETE_ACCOUNT)
public void deleteAccount() {
PositionAccount account = tv_loro_nostro_accounts.getSelectionModel().getSelectedItem();

DeleteAccount input = new DeleteAccount();
input.setAccountId(account.getId());
input.setType(account.getAccountType());
input.setAccNum(account.getAccountNumber());
input.setAccName(account.getAccountName());
input.setCurrency(account.getCurrencyCode());
input.setBalance(account.getBalance());
input.setCurState(0);

service.deleteAccount(input, context.getTaskView(), result -> {
model.getAccounts().addAll(result.getAccount());
tv_loro_nostro_accounts.getSelectionModel().selectFirst();
});
}

其中tv_loro_nostro_accounts是我从中进行选择的TableViewDeleteAccount 类是我使用 getterssetters 定义表的所有字段的类。经过一些操作后,service.deleteAccount 位于此处:

@Path("deleteAccount")
@POST
public DeleteAccount deleteAccount(DeleteAccount model){
try {
model = operationService.execute(model,(result, userDetails) -> {

PositionAccount a = new PositionAccount();
a.setAccountType(result.getType());
a.setAccountNumber(result.getAccNum());
a.setAccountName(result.getAccName());
a.setCurrencyCode(result.getCurrency());
a.setState(0);
service.deleteAccount(a);

result.setState(OperationState.DONE);
return result;
});
}catch (AdcException e) {
logger.error("X: ", e);
model.setState(OperationState.ERROR);
model.setErrorText(e.getLocalizedMessage(model.getLocale()));
} catch (Exception e) {
logger.error("X: ", e);
model.setState(OperationState.ERROR);
model.setErrorText(e.getLocalizedMessage());
}
return model;
}

其中 service.deleteAccount

public void deleteAccount(PositionAccount account){
repository.deleteAccount(account);
}

repository.deleteAccount

public void deleteAccount(PositionAccount account){
em.merge(account);
em.refresh(account);
}

当我运行上面时,我收到错误

Entity not managed; nested exception is java.lang.IllaegalArgumentException: Entity not managed

请hrlp修复以上问题。

最佳答案

merge 返回托管实体实例,因此要使其不引发异常,请执行以下操作:

account = em.merge(account);
em.refresh(account);

但是,refresh会覆盖所有更改,因此这里不需要。您的方法应如下所示:

public void deleteAccount(PositionAccount account) {
em.merge(account);
}

关于java - 使用Hibernate merge() 和refresh(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31367698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com