我有一个表,我想在按删除按钮时将映射表的状态字段从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
是TableView
可供选择。 DeleteAccount
类是我用getters
和setters
定义表的所有字段的类。经过一些操作后,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);
}