【问题标题】:set the id of auto increment field in hibernate is not saved properly在hibernate中设置自动增量字段的id没有正确保存
【发布时间】:2013-02-07 11:42:26
【问题描述】:

账户类:

@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

如何覆盖 id?

【问题讨论】:

标签: java mysql hibernate


【解决方案1】:

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

不确定,但您的想法是使用 String 值,如何递增?你不想用 Long 代替吗?

【讨论】:

  • 我需要保存一个特定的id,所以这部分代码不需要分配的“自动增量”id(它用于其他地方)
  • db 将 id 定义为 big int,但我在代码中使用了字符串,我认为这不是导致问题的原因,因为当我使用“getAccountId()”时效果很好跨度>
【解决方案2】:

首先,您不得为生成的字段赋值。它将被生成的替换。这是预期的行为。

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

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

【讨论】:

    【解决方案3】:

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

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

    然后进行更改并合并。

    【讨论】:

    • 主要问题是实体不再在数据库中(它以某种方式被删除),我想重新创建它......
    • 如果您确定您希望实体拥有的 id 是唯一的,那么您可以使用 jdbc 语句手动插入具有该 id 的记录,但据我所知,您可以如果您执行插入操作,则使用 hibernate 作为 @GeneratedValue 只会为您创建一个新值。
    • 另外,@Id 注释会阻止您在插入后更新插入实体的 accountId 列。
    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 2010-10-06
    • 1970-01-01
    • 2016-04-05
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多