Java / Hibernate的 – MySQLIntegrityConstraintViolationException:重复键'PRIMARY'

我正在研究一个程序,该程序读取XLS文件的指定列,并将此数据保存到MySQL数据库(InnoDB引擎,utf8默认sorting规则)。

我实现了一个函数来检查文件是否已经改变,如果是这样的话,程序应该只把差异写到数据库中。 我正在使用Hibernate(使用函数session.saveOrUpdate()进行映射,并使用Apache POI进行文件处理。

我第一次运行这个程序对一个空的数据库,到目前为止一切运行良好。

问题:我得到MySQLIntegrityConstraintViolationException: Duplicate entry '2014-09-10 16:09:28' for key 'PRIMARY'时,有条目已经存在于数据库中(当我尝试提供完全相同的XLS文件的程序就像以前运行一样,这在逻辑上意味着它不应该更新或保存任何东西)。

为了确定来自数据库的数据和来自XLS文件的数据是否相等,我使用下面的代码,它将数据库中的所有条目提取到我的域对象列表(列表列表)中,并对列表进行sorting和比较我从XLS文件中获得的域对象:

 public void retrieveFromDB() { try { DatabaseManager _dbManager = new DatabaseManager(SessionFactoryUtil.SYSTEM_ID_PARAMETER); _dbManager.beginTransaction(); setBackupValuesList(_dbManager.getDomainObject()); System.out.println("SIZE OF LIST 1: " + getBackupValuesList().size()); _dbManager.commitTransaction(); _dbManager.endTransaction(); log.info("RETRIEVED DATA FROM DATABASE!"); } catch (Exception e) { log.fatal("UNABLE TO OPEN DB CONNECTION OR COMMITING TRANSACTION!"); e.printStackTrace(); } } public DomainObject determineLastFromDB(List<DomainObject> backupValuesList) { DomainObject gdhElement = null; if (backupValuesList.size() == 0) { log.info("NO OBJECTS IN DATABASE!"); } else { Iterator<DomainObject > itr = backupValuesList.iterator(); gdhElement = itr.next(); while (itr.hasNext()) { gdhElement = itr.next(); } } return gdhElement; } public List<DomainObject> removeOldDataFromXLS(DomainObject gdhElement) { if (backupValuesList.size() == 0 || gdhElement.equals(null)) { log.info("NO OBJECTS IN DATABASE! COPYING ALL DATA!"); } else if (backupValuesList.size() != 0 || !(gdhElement.equals(null))) { Iterator<DomainObject> iter = xlsValuesList.iterator(); while (iter.hasNext()) { DomainObjectelement = iter.next(); // remove all elements that are older than the latest element // date in the database if ((element.getDate().before(gdhElement.getDate()))) { iter.remove(); } } } return xlsValuesList; } 

我的hibernate_localhost.cfg.xml如下所示:

 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/databasename?zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true</property> <property name="connection.username"> removed </property> <property name="connection.password"> removed </property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> <property name="current_session_context_class">thread</property> <!-- this will show us all sql statements --> <property name="hibernate.show_sql">false</property> <!-- Pooling settings --> <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="c3p0.min_size">0</property> <property name="c3p0.max_size">30</property> <property name="c3p0.timeout">600</property> <property name="c3p0.max_statements">0</property> <property name="c3p0.acquire_increment">1</property> <property name="c3p0.idle_test_period">60</property> <!-- mapping files --> <mapping resource="path/to/DomainObject.hbm.xml"/> </session-factory> </hibernate-configuration> 

我的Hibernate映射文件如下所示:

 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Sep 5, 2014 6:01:25 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="path.to.DomainObjectClass" table="tablename"> <id name="date" type="java.sql.Date"> <column name="date" /> <generator class="assigned" /> </id> <property name="value" type="double"> <column name="value" /> </property> <property name="whenModified" type="java.lang.String"> <column name="whenModified" /> </property> </class> </hibernate-mapping> 

我不明白的是:

数据库中最新条目的date(主键): 2014-09-09 XLS文件中最新条目的 date 2014-09-09 例外中显示的date为重复条目: 2014-09-10 16:09:28

它总是显示当前的date/时间在exception(不是从XLS条目的date),我绝对不是试图保存到数据库。

我尝试了很多debugging,但是我完全不知道解决scheme! 任何提示都非常感谢!