在hibernate中设置自动增量字段的id未正确保存

时间:2013-02-07 11:42:27

标签: java mysql hibernate

帐户类:

@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?

3 个答案:

答案 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);

然后进行更改和合并。