Java / Hibernate - MySQLIntegrityConstraintViolationException:密钥' PRIMARY'的重复条目。

时间:2014-09-10 23:38:41

标签: java mysql excel hibernate apache-poi

我正在研究一个程序,它读取XLS文件的指定列并将这些数据保存到MySQL数据库(InnoDB引擎,utf8-default collat​​ion)。

我实现了一个函数来检查文件是否已更改,如果是,程序应该只将差异写入数据库。我使用 Hibernate(使用函数session.saveOrUpdate()进行映射,使用 Apache POI 进行文件处理。

我第一次针对空数据库运行此程序时,到目前为止一切运行良好。

ISSUE: 当数据库中已存在条目时(以及当我尝试使用与运行时完全相同的XLS文件来提供程序时),我会收到 MySQLIntegrityConstraintViolationException: Duplicate entry '2014-09-10 16:09:28' for key 'PRIMARY' 之前,从逻辑上讲它不应该更新或保存任何东西)。

为了确定来自数据库的数据和来自XLS文件的数据是否相等,我使用以下代码,该代码将数据库中的所有条目提取到我的域对象列表(列表列表)和排序&将其与我从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>

我没有得到以下内容:

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

它总是在异常中显示当前日期/时间(不是XLS条目中的日期),我绝对不会将其保存到数据库中。

我尝试了很多调试但是在完全混淆的时候我没有看到解决方案!任何提示都非常感谢!

0 个答案:

没有答案