我正在研究一个程序,它读取XLS文件的指定列并将这些数据保存到MySQL数据库(InnoDB引擎,utf8-default collation)。
我实现了一个函数来检查文件是否已更改,如果是,程序应该只将差异写入数据库。我使用 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&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条目中的日期),我绝对不会将其保存到数据库中。
我尝试了很多调试但是在完全混淆的时候我没有看到解决方案!任何提示都非常感谢!