2015-11-17 2 views
1

У меня проблема с моим проектом. Мой apache derby генерирует id, в таблице он работает. Но в приложении это не работает. В дерби я ставлю ID автоинкрементный (начинается с 1, увеличивается на 1), но я получаю эту ошибку:Была сделана попытка изменить идентификационный столбец 'ID'

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

.

Моя сущность:

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:

<?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> 

Благодаря

+1

так ... не пытайтесь изменить идентификатор. – Stultuske

ответ

1

Если вы установите в поле ID таблицы на автоматическое приращение то вам не следует пытаться o вставить идентификатор, потому что это автоматически генерируется derby.

или использовать Hibernate для создания вам идентификатор

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

, но если я удалю автоинкремент в дерби, он только отменяет одного пользователя. Когда я сохраняю пользователя в сеансе, я использую saveOrUpdate, и это должно генерировать идентификатор, но это не – sponge

+0

Я пробовал все из них, но они не работают – sponge

+0

Я вижу, что вы помещаете аннотации поверх геттера, возможно, это – aurelius

0

Если вы определяете таблицу таким образом (либо с GENERATED BY DEFAULT или GENERATED AS ALWAYS ключевых слов)

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)) 

вы не можете непосредственно вставить что-либо в id. Вы получаете эту ошибку, когда пытаетесь сделать это. Вы вставляете данные в Identity поле, как это:

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

Таким образом, поле идентификатор генерируется автоматически для вас и увеличивается, когда вы когда-либо заполнить новый столбец.

Примечание я скопировал SQL заявления выше из консоли в Intellij, чтобы использовать в классе Java, добавить конкатенации строк в зависимости от обстоятельств:

statement.executeUpdate("INSERT INTO Consultation (PATIENT_ID, CONSULTATION_DATE) VALUES " + 
       "('2345', '4-8-2016')"); 
Смежные вопросы