Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

identifier of an instance was altered from 1 to 2

Tags:

hibernate

What I am trying to do is read a text file in the code and insert it into a table called employee1. And I am getting this error:

Hibernate: insert into EMPLOYEE1 (NAME, SALARY, MANAGER, ID) values (?, ?, ?, ?) identifier of an instance of com.Employee altered from 1 to 2 Exception in thread "main" org.hibernate.HibernateException: identifier of an instance of com.Employee altered from 1 to 2 at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:51) at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:82) at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:190) at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:70) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:669) at roseindia.tutorial.hibernate.FirstExample.main(FirstExample.java:98)

Code of the Employee.java

public class Employee 
{

    private int id;
    private String name;
    private double salary;
    private String manager;


    public int getId() 
    {
        return id;
    }

    public void setId(int s) 
    {
        id = s;
    }
    //***************************************************//  
    public String getName() 
    {
        return name;
    }

    public void setName(String s) 
    {
        name = s;
    }
    //***************************************************//  
    public double getSalary() 
    {
        return salary;
    }

    public void setSalary(double s) 
    {
        salary = s;
    }
    //***************************************************//
    public String getManager() 
    {
        return manager;
    }

    public void setManager(String s) 
    {
        manager = s;
    }
}

Code of the EmployeeEx.java(exection)

import java.io.File;
import java.util.Scanner;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.Employee;

public class EmployeeEx 
{

public static void main(String[] args) 
{
    Session session = null;

    try
    {       
        Transaction transaction = null; 

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        session =sessionFactory.openSession();

        Employee em = new Employee();   

        File f=new File("c:/Class/Employee1.txt") ;
        Scanner scan=new Scanner(f);
        transaction = session.beginTransaction();
        while(scan.hasNext())
        {               

            String line=scan.nextLine();            
            String empArray[]=line.split(" ");


            em.setId(Integer.parseInt(empArray[0]));
            em.setName(empArray[1]);
            em.setSalary(Double.parseDouble(empArray[2]));
            em.setManager(empArray[3]);

            session.save(em);
            transaction.commit();
        }


}
catch(Exception e)
{
    System.out.println(e.getMessage());
}
finally
{
    session.flush();
    session.close();

}


}

}

The config file:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
  <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
  <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
  <property name="hibernate.connection.username">system</property>
  <property name="hibernate.connection.password">system</property>
  <property name="hibernate.connection.pool_size">10</property>
  <property name="show_sql">true</property>
  <property name="dialect">org.hibernate.dialect.OracleDialect</property>
  <property name="hibernate.hbm2ddl.auto">update</property>
  <!-- Mapping files -->
  <mapping resource="contact.hbm.xml"/>
  <mapping resource="com.hbm.xml"/>
</session-factory>
</hibernate-configuration>

The mapping file:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.Employee" table="EMPLOYEE1">
   <id name="id" type="int" column="ID" >
   <generator class="assigned"/>
  </id>

  <property name="name">
     <column name="NAME" />
  </property>
  <property name="salary">
    <column name="SALARY"/>
  </property>
  <property name="manager">
    <column name="MANAGER"/>
  </property>
</class>

</hibernate-mapping>
like image 375
user1607251 Avatar asked Aug 17 '12 15:08

user1607251


3 Answers

Effectively you are having just one Employee instance and you are persisting the same one again and again...

Employee em = new Employee();    // Not a right place..

while(scan.hasNext())
{               
   // Employee em = new Employee(); // Should be here...
   em.setId(Integer.parseInt(empArray[0]));
   em.setName(empArray[1]);
   em.setSalary(Double.parseDouble(empArray[2]));
   em.setManager(empArray[3]);
   ....
}
like image 159
Bharat Sinha Avatar answered Nov 11 '22 18:11

Bharat Sinha


Use Session.merge(Object) to replace Session.save(Object).

like image 26
WestCoastBaby Avatar answered Nov 11 '22 19:11

WestCoastBaby


change the int id field from your pojo and mapping file to long.

like image 1
Nitin Pawar Avatar answered Nov 11 '22 18:11

Nitin Pawar