1

账户类:

@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());

它打印一个不等于 tempId 的 accountId,我认为它是因为它是表中的自动增量字段

另一方面,如果我这样做:

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

我怎样才能覆盖身份证?

4

3 回答 3

0

首先,您不能将值分配给生成的字段。它将被生成的替换。它是一种预期的行为。

其次,你不能改变id。所有实体都通过其 id 映射到数据库。如果你改变一个 id,它就是一个新的实体。你不能更新它,你必须保存它。

我认为任何 JPA 实现都没有覆盖 id 机制。如果您想自己设置 id 就可以了,然后删除 GeneratedValue 注释并对您的持久性存储执行相同的操作。然后您可以将您的值保存为 ID。

于 2013-02-07T12:20:26.573 回答
0

如果您想使用特定 id 并且数据库中已经存在具有该 id 的实体,则必须首先从会话中获取实体:

Account a = session.get(Account.class, id);

然后进行更改并合并。

于 2013-02-07T13:07:23.390 回答
0

您不必设置 id,当您持久化实体时,hibernate 会自动分配 id(根据使用生成的值注释定义的策略)。

不确定,但是您正在为您的想法使用 String 值,如何增加它?你不想用 Long 代替吗?

于 2013-02-07T11:50:06.833 回答