7

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

Hibernate:插入到 EMPLOYEE1(NAME,SALARY,MANAGER,ID)值(?,?,?,?) com.Employee 实例的标识符从 1 更改为 2 线程“main”中的异常 org.hibernate.HibernateException:标识符在 org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:82) 的 org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:51) 的 com.Employee 实例的 1 更改为 2在 org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:190) 在 org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:70) 在 org.hibernate.event.def.DefaultFlushEventListener.onFlush (默认刷新事件监听器。java:26) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:669) atroseindia.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>
4

3 回答 3

9

实际上,您只有一个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]);
   ....
}
于 2012-08-17T16:58:57.023 回答
3

用来Session.merge(Object)代替Session.save(Object)

于 2017-05-05T11:56:25.820 回答
1

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

于 2015-06-08T14:48:33.017 回答