帐户类:
@Entity
@Table(name = "Account")
public class Account {
...
private String accountId;
...
@Id
@GeneratedValue
@Column(name = "accountId")
public String getAccountId() {
return accountId;
}
public void setAccountId(String accountId) {
this.accountId = accountId;
}
...
如果我尝试这样做:
temp = new Account();
temp.setAccountId(tempId); //
session.save(temp);
System.out.println("accountid...." + temp.getAccountId());
它打印的accountId不等于tempId, 我认为它是因为它是表中的自动增量字段
另一方面,如果我这样做:temp = new Account();
session.save(temp);
temp.setAccountId(tempId);
session.merge(temp);
我得到例外:
org.hibernate.HibernateException: identifier of an instance
of ... was altered from 1244 to 1221
如何覆盖id?
答案 0 :(得分:0)
您不必设置id,当您持久保存实体时,hibernate将自动分配id(根据使用生成的值注释定义的策略)。
不确定,但您使用的是String值,如何增加?难道你不想使用Long吗?
答案 1 :(得分:0)
首先,您不能为生成的字段分配值。它将被生成的替换。这是一种预期的行为。
其次,你不能改变身份。所有实体都通过其ID映射到数据库。如果更改id,则为新实体。您无法更新它,您必须保存它。
我认为任何JPA实现都没有覆盖id机制。如果你想自己设置id,那么删除GeneratedValue注释并为你的persistance商店做同样的事情。然后,您可以将值保存为ID。
答案 2 :(得分:0)
如果您想使用特定的ID并且数据库上已有一个具有该ID的实体,您必须首先从会话中获取该实体:
Account a = session.get(Account.class, id);
然后进行更改和合并。