我有一个具有以下结构的部门表
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(自动编号),我使用的数据库是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中的我的Department类如下所示。我正在使用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)”,它可以正常工作并且一个部门(DB中的最大id值)+1作为id值。
答案 0 :(得分:0)
根据您的实体部门,您将id字段标记为具有生成类型标识的标识。当hibernate看到这个时,插入它会自动将id增加1.如果你不想要这个你必须删除代汽车的东西然后你可以setid到你需要的东西。以下链接为您提供有关如何在休眠中选择生成类型的更多信息
How to choose the id generation strategy when using JPA and Hibernate