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>
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]);
....
}
Use Session.merge(Object) to replace Session.save(Object).
change the int id field from your pojo and mapping file to long.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With