2015-11-17 3 views
1

J'ai un problème avec mon projet. Mon apache derby génère un identifiant, dans la table cela fonctionne. Mais dans l'application, ça ne marche pas. Dans le derby, je identifiant de l'ensemble autoincrement (en commençant par 1, incrémenter par 1), mais je reçois cette erreur:Une tentative a été faite pour modifier la colonne d'identité 'ID'

> Caused by: ERROR 42Z23 : An attempt was made to modify the identity 
> column ' ID' 

.

Mon entité:

package com.springapp.mvc.models; 

import javax.persistence.*; 

@Entity 
@Table(name = "USERS", schema = "KK", catalog = "") 
public class UsersEntity { 
    private int id; 
    private String name; 
    private String password; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Basic 
    @Column(name = "NAME") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Basic 
    @Column(name = "PASSWORD") 
    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     UsersEntity that = (UsersEntity) o; 

     if (id != that.id) return false; 
     if (name != null ? !name.equals(that.name) : that.name != null) return false; 
     if (password != null ? !password.equals(that.password) : that.password != null) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = id; 
     result = 31 * result + (name != null ? name.hashCode() : 0); 
     result = 31 * result + (password != null ? password.hashCode() : 0); 
     return result; 
    } 
} 

xml mise en veille prolongée:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="connection.url">jdbc:derby://localhost:1527/MyDB</property> 
     <property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> 

     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.DerbyDialect</property> 
     <!-- <property name="hbm2ddl.auto">update</property> 
Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 
     <mapping resource="mapping.xml"/> 
     <mapping class="com.springapp.mvc.models.AccountEntity"/> 
     <mapping class="com.springapp.mvc.models.BookEntity"/> 
     <mapping class="com.springapp.mvc.models.UsersEntity"/> 
    </session-factory> 
</hibernate-configuration> 

mapping.xml

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 

    <class name="com.springapp.mvc.models.AccountEntity" table="ACCOUNT" schema="KK"> 
     <id name="id" column="ID"/> 
     <property name="name" column="NAME"/> 
     <property name="accountprefix" column="ACCOUNTPREFIX"/> 
     <property name="accountnumber" column="ACCOUNTNUMBER"/> 
     <property name="bankcode" column="BANKCODE"/> 
     <property name="userid" column="USERID"/> 
    </class> 
    <class name="com.springapp.mvc.models.BookEntity" table="BOOK" schema="KK"> 
     <id name="id" column="ID"/> 
     <property name="title" column="TITLE"/> 
     <property name="description" column="DESCRIPTION"/> 
     <property name="userid" column="USERID"/> 
    </class> 
    <class name="com.springapp.mvc.models.UsersEntity" table="USERS" schema="KK"> 
     <id name="id" column="ID"/> 
     <property name="name" column="NAME"/> 
     <property name="password" column="PASSWORD"/> 
    </class> 
</hibernate-mapping> 

Merci

+1

donc ... ne pas essayer de modifier l'identifiant. – Stultuske

Répondre

1

Si vous définissez le champ de la table d'ID à incrémentation automatique alors vous ne devriez pas essayer t o insérer un identifiant car il est généré automatiquement par derby.

ou utiliser Hibernate pour générer vous id

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 
+0

mais si je supprime autoincrement en derby, il ne remplace qu'un seul utilisateur. Quand je sauve l'utilisateur dans la session j'utilise saveOrUpdate et ceci devrait générer l'identification, mais il doesnt – sponge

+0

j'ai essayé tous, mais ils ne fonctionnent pas – sponge

+0

je vois que vous mettez les annotations au-dessus du getter, il pourrait être que – aurelius

0

Si vous définissez votre table de cette façon (soit avec les GENERATED BY DEFAULT ou GENERATED AS ALWAYS mots-clés)

CREATE TABLE Consultation (id INTEGER PRIMARY KEY NOT NULL GENERATED BY DEFAULT 
    AS IDENTITY (START WITH 1, INCREMENT BY 1), 
Patient_id CHAR(10) NOT NULL REFERENCES PATIENT(CARDNUMBER), 
Consultation_date CHAR(20)) 

vous ne pouvez pas insérer directement quoi que ce soit dans id. Vous obtenez cette erreur lorsque vous essayez de le faire. Vous insérez des données dans un champ Identity comme ceci:

INSERT INTO CONSULTATION (PATIENT_ID, CONSULTATION_DATE) VALUES ('B2345', '4-8-2016') 

De cette façon, le champ id est généré automatiquement pour vous et incrémenté à chaque fois que vous remplissez une nouvelle colonne.

Remarque je copiais les instructions SQL ci-dessus de la console dans IntelliJ, à utiliser dans une classe java, ajouter concaténation chaîne selon le cas:

statement.executeUpdate("INSERT INTO Consultation (PATIENT_ID, CONSULTATION_DATE) VALUES " + 
       "('2345', '4-8-2016')");