gpt4 book ai didi

java - 使用相同 ID 的 Hibernate DB 对象映射时出错

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:06 25 4
gpt4 key购买 nike

我正在使用 Spring MVC 和 Hibernate 做一个实践项目。知道 Hibernate 可以使用注释将数据库行映射到对象,我尝试使用 Query 将所有 Account 对象从数据库获取到列表,而在插入它们时,它们有一些重复的 ID。

获取帐户的代码

@Override
public List<Account> getAccounts() {
List<Account> list = new ArrayList<>();
try {
Session session = sessionFactory.getCurrentSession();
Query<AccountEntity> query = session.createQuery("From AccountEntity", AccountEntity.class);
List<AccountEntity> accounts = query.getResultList();
for (int i = 0; i < accounts.size(); i++) {
AccountEntity accountEntity = (AccountEntity) accounts.get(i);
Account account = new Account();
account.setAccountNo(accountEntity.getAccNo());
account.setAccountHolderName(accountEntity.getAccHolderName());
account.setBalance(accountEntity.getBalance());
account.setAccountType(accountEntity.getAccountType());
account.setPsCode(accountEntity.getPsCode());
account.setDateOfBirth(accountEntity.getDateOfBirth());
System.out.println("#: " + account.getAccountNo() + ", name: " + account.getAccountHolderName());
list.add(account);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}

现在,当我在 View 中使用它们时,重复的 ID 会生成具有相同 ID、名称和余额的行(名称在数据库中不同)。 rows become the same

是不是因为Hibernate中的映射仅仅依赖于ID,如果ID相同,就会产生相同的对象。

带有注释的AccountEntity类:

@Entity @Table(名称=“账户”)公共(public)类 AccountEntity {

@Id
@Column(name="accountNo")
private int accNo;

@Column(name="accountHolderName")
private String accHolderName;

@Column(name="balance")
private int balance;

@Column(name="accountType")
private String accountType;

@Column(name="dateOfBirth")
private Date dateOfBirth;

@Column(name="psCode")
private String psCode;

public AccountEntity() {
}

public int getAccNo() {
return accNo;
}

public void setAccNo(int accNo) {
this.accNo = accNo;
}

public String getAccHolderName() {
return accHolderName;
}

public void setAccHolderName(String accHolderName) {
this.accHolderName = accHolderName;
}

public int getBalance() {
return balance;
}

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

public String getAccountType() {
return accountType;
}

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

public Date getDateOfBirth() {
return dateOfBirth;
}

public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}

public String getPsCode() {
return psCode;
}

public void setPsCode(String psCode) {
this.psCode = psCode;
}

}如果我在这里删除 @Id 会怎样?

最佳答案

Hibernate 在其第一级缓存(Hibernate session )中按 ID 缓存对象。一旦它找到一个 Id 对象并缓存它,它总是在 Hibernate session 的生命周期内返回相同的对象实例。 (这是一种称为“身份映射”的模式的情况,here 给出了很好的解释)。

@Id标记映射到映射到实体类的表的主键的字段。主键值必须是唯一的,表中的两行不能具有相同的 Id 值。 Hibernate 希望您映射到某种关系模型,而不仅仅是任何随机垃圾,这意味着键必须是唯一的。

顺便说一句,请注意,您不应该捕获您发布的代码中所示的异常,而应该让它们被抛出。您可以指定一个带有@ControllerAdvice标记的组件来处理 Controller 抛出的异常。最简单、最直接的方法是使用与业务逻辑和数据访问 Controller 分开的事务服务层。

关于java - 使用相同 ID 的 Hibernate DB 对象映射时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752052/

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