【问题标题】:identifier of an instance was altered from 1 to 2实例的标识符从 1 更改为 2
【发布时间】:2012-08-14 01:35:20
【问题描述】:

我要做的是读取代码中的文本文件并将其插入到名为employee1 的表中。我收到了这个错误:

休眠:插入 EMPLOYEE1(姓名、工资、经理、ID)值 (?, ?, ?, ?) com.Employee 实例的标识符从 1 更改 线程“主”org.hibernate.HibernateException 中的 2 异常: com.Employee 实例的标识符从 1 更改为 2 org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:51) 在 org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:82) 在 org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:190) 在 org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:70) 在 org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26) 在 org.hibernate.impl.SessionImpl.flush(SessionImpl.java:669) 在 roseindia.tutorial.hibernate.FirstExample.main(FirstExample.java:98)

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;
    }
}

EmployeeEx.java 的代码(执行)

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

}


}

}

配置文件:

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

映射文件:

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

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    实际上,您只有一个 Employee 实例,并且您一次又一次地坚持相同的实例...

    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]);
       ....
    }
    

    【讨论】:

      【解决方案2】:

      使用Session.merge(Object) 替换Session.save(Object)

      【讨论】:

        【解决方案3】:

        将您的 pojo 和映射文件中的 int id 字段更改为 long

        【讨论】:

          最近更新 更多