2016-04-24 2 views
0

ich eine Abteilung Tischunabhängiges Unternehmen geführt zu beharren, wenn Kennungswert für GenerationType.IDENTITY als Strategie der Bereitstellung der Kennung

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

Hinweis unten Struktur zu erzeugen, die die ID auto_increment (Autonummer) und die Datenbank ist, dass Ich benutze ist MySQL.

Während der Einfügung, wenn ich den Wert für ID angeben, nimmt es diese ID und fügt einen Datensatz ein. In der unteren Anweisung wird ein Datensatz mit der ID = 9 eingefügt.

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

Wenn ich für id den Wert nicht angeben, nimmt es den nächsten Wert und fügt einen Datensatz. In diesem Fall wäre die ID 10. Die folgende Anweisung fügt einen Datensatz mit ID = 10 ein.

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

Meine Abteilung Klasse in Java sieht wie folgt aus. Ich verwende Hibernate/JPA als Persistenzanbieter Ich verwende GenerationType.IDENTITY als Strategie, um den Bezeichner für das Objekt zu generieren.

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

} 

Ich persistierenden Abteilung wie folgt:

// 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(); 

Da ich den Wert für id als 13 bereitstellt, erwarte ich, dass ein Datensatz mit id = 13 würde in der Datenbank beibehalten werden , aber überwintert/JPA gibt den Fehler unter:

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) 

Warum wird die neu geschaffene Abteilung als frei stehenden Einheit zu sagen? Wenn ich "dept.setId (13)" auskommentiere, funktioniert es gut und eine Abteilung mit (max ID-Wert in DB) +1 als ID-Wert.

Antwort

0

Gemäß Ihrer Entitätsabteilung haben Sie ein ID-Feld, das als Identität mit der Identitätstyp-Identität gekennzeichnet ist. Wenn Hibernate dies während des Einfügens sieht, wird automatisch die ID um 1 erhöht. Wenn Sie dies nicht möchten, müssen Sie das generation Auto-Ding entfernen und dann können Sie einstellen, was immer Sie brauchen. Der untenstehenden Link gibt Ihnen mehr Informationen darüber, wie

die Erzeugungsart in Hibernate wählen

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

+0

ich überwintern will die id (max id + 1) zur Verfügung zu stellen, wenn die ID nicht oder ist 0. Aber wenn die ID wird bereitgestellt, ich möchte überwintern, um das zu verwenden. Dies ist genau das Verhalten von MySQL. –

+0

Ich weiß nicht, Kumpel, wenn dies möglich ist, da ich auch ein Anfänger im Winterschlaf bin. Kannst du bitte eine neue Frage stellen? Jemand mit mehr Erfahrung könnte eine Antwort dafür haben. – LearningPhase

+0

Wie auch immer, danke für deinen Kommentar. –

Verwandte Themen