gpt4 book ai didi

java - 在为 GenerationType.IDENTITY 提供标识符值作为生成标识符的策略时传递给持久化的分离实体

转载 作者:行者123 更新时间:2023-11-30 22:20:15 25 4
gpt4 key购买 nike

我有一个具有以下结构的部门表

Field       Type            Null    Key     Default     Extra
id int(11) NO PRI auto_increment
name varchar(45) NO UNI
description varchar(100) YES

请注意,id 是 auto_increment(auto number),我使用的数据库是 MySQL。

在插入期间,如果我提供 id 的值,它会获取该 id 并插入一条记录。下面的语句插入一条 id=9 的记录。

insert into department values(9, "dept09", "department 09");

如果我不提供 id 的值,它会采用下一个值并插入一条记录。在这种情况下 id 将是 10 。下面的语句插入一条 id=10 的记录。

insert into department(dept_name, description) values("dept10", "department 10");

我的 Java 部门类如下所示。我使用 hibernate/JPA 作为持久性提供者我使用 GenerationType.IDENTITY 作为生成对象标识符的策略。

@Entity
public class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private String description;
....

}

我坚持以下部门:

// create and persist an Department
em.getTransaction().begin();
Department dept = new Department();
dept.setId(13);
dept.setName("dept13");
dept.setDescription("Department 13");
em.persist(dept);
em.getTransaction().commit();

因为我提供的 id 值为 13,所以我希望 id=13 的记录会保留在数据库中,但是 hibernate/JPA 给出了以下错误:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mycompany.app.Department
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1152)
at com.mycompany.services.DepartmentService.createDepartment(DepartmentService.java:21)

为什么说新创建的部门是分离的实体?如果我注释掉“dept.setId(13)”,它工作正常并且一个部门(数据库中的最大 id 值)+1 作为 id 值。

最佳答案

根据您的实体部门,您将 id 字段标记为具有生成类型身份的身份。当 hibernate 在插入时看到这个时,它会自动将 id 增加 1。如果你不想要这个,你必须删除生成自动的东西,然后你可以将 id 设置为你需要的。下面的链接为您提供了有关如何在 hibernate 中选择生成类型的更多信息

How to choose the id generation strategy when using JPA and Hibernate

关于java - 在为 GenerationType.IDENTITY 提供标识符值作为生成标识符的策略时传递给持久化的分离实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36820004/

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