在为GenerationType.IDENTITY提供标识符值时传递的已分离实体将作为生成标识符的策略

时间:2016-04-24 06:27:09

标签: java mysql hibernate jpa

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

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值。

1 个答案:

答案 0 :(得分:0)

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

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