0
我有一個表,並且當我按下刪除按鈕時,我想將映射表的狀態字段從1更改爲0。這是邏輯。使用休眠merge()和refresh()
這是我的映射表
@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
請小心解決以上問題。
您在'deleteAccount(...)'中創建一個新對象。如果我沒有錯,你需要先堅持對象,這樣它才能被管理。不確定,但我認爲合併只適合,如果對象處於分離狀態。 [查看更多有價值的信息](http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge) – lunatikz