使用 SingleConnection=true 更新浮点值不会为 UCanAccess 保留

Update to float value not being persisted for UCanAccess with SingleConnection=true

我有一个项目使用 EclipseLink-2.6.0 和 UCanAccess-3.0.4(作为数据库驱动程序)来修改 MS Access 数据库。 (注意遗留要求 - 不是我的选择)。

有一个 table 具有单精度列(同样,遗留要求 - 不是我的选择)。

如果该字段被更新,那么在该点 'appear' 之后的任何更新都将被提交,但在关闭并重新打开数据库后,对该字段的最后更新始终是初始更新,所有其他更新都已丢失.

我整理了一个项目,该项目使用 JPA 和直接使用 JDBC 来测试此场景。 JDBC 连接正确刷新了对数据库的更改,而 JPA 测试没有。

测试项目的URL为:https://github.com/william-ferguson-au/eclipselink-flush-test

注意 UCanAccess 连接配置为 SingleConnection=true 因为我需要确保一旦关闭 EntityManagerFactory,就会释放 MS Access 数据库上的锁。我想这才是问题的症结所在。

失败的测试输出类似于:

[EL Info]: server: 2016-05-01 17:59:35.858--ServerSession(1690826692)--Detected server platform: org.eclipse.persistence.platform.server.NoServerPlatform.
lastValue=0.0 entry#value=0.0 newValue=1.4
lastValue=1.4 entry#value=1.4 newValue=2.8
lastValue=2.8 entry#value=2.8 newValue=4.2
lastValue=4.2 entry#value=4.2 newValue=5.6
lastValue=5.6 entry#value=5.6 newValue=7.0
lastValue=7.0 entry#value=7.0 newValue=8.4
lastValue=8.4 entry#value=8.4 newValue=9.8
lastValue=9.8 entry#value=9.8 newValue=11.2
lastValue=11.2 entry#value=11.2 newValue=12.6
lastValue=12.6 entry#value=12.6 newValue=14.0
lastValue=14.0 entry#value=14.0 newValue=15.4
lastValue=15.4 entry#value=15.4 newValue=16.8
lastValue=16.8 entry#value=16.8 newValue=18.2

Database - closed
Database - reopened

[EL Warning]: 2016-05-01 17:59:39.906--session_manager_no_partition
 lastValue=18.2
[EL Info]: server: 2016-05-01 17:59:39.922--ServerSession(1276502808)--Detected server platform: org.eclipse.persistence.platform.server.NoServerPlatform.
lastValue=18.2 entry#value=1.4 newValue=28.2
[EL Warning]: 2016-05-01 17:59:40.568--session_manager_no_partition

java.lang.AssertionError: Expected=18.2 found=1.4

    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.assertTrue(Assert.java:41)
    at au.com.xandar.eclipselink.flush.DoubleFlushTest.verifyEntityValue(DoubleFlushTest.java:133)
    at au.com.xandar.eclipselink.flush.DoubleFlushTest.testExplicitUpdatesJPA(DoubleFlushTest.java:120)

如果我在配置 EntityManagerFactory 时设置 SingleConnection=false,则更新将刷新到数据库,并在重新打开数据库时可见。但是后来我无法释放 MS Access DB 上的文件锁,直到 VM 被销毁。

所以我认为这是 EclipseLink 中的错误 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=492773)。但现在我认为这更可能是 UCanAccess 在 JPA 环境中处理 SingleConnection=true 的方式中的错误。或者我可能遗漏了一些必需的配置,以便以与 JDBC.

相同的方式刷新 EclipseLink JPA

使用 UCanAccess 和 SingleConnection=true 时应该喜欢预期的行为吗?

跟进 #1

@GordThompson 指出原来的 DB 字段是 single 而不是 double。并且将 DB 字段更改为 double(以匹配原始 Entity 字段)使一切正常。但我无法更改数据库。所以我将Entity字段改为Float(即single)来匹配DB字段,问题依然存在,而且更加普遍。

然后我意识到行为会根据 JPA 环境中的 UCanAccess SingleConnection 属性 的值而改变。

跟进 #2

仅当使用 PreparedStatement 且 SingleConnection=true 时,才可以使用 UCanAccess 进行复制。查看更新的测试用例。

跟进 #3 看来问题只有在更新 Float/Double 字段、关闭数据库、打开数据库、检查字段、关闭数据库、对不同的数据库重复相同操作时才变得明显 none第二个数据库的值得到保留。 UCanAccess-3.0.5

时仍然发生

讨论已移至 https://sourceforge.net/p/ucanaccess/discussion/general/thread/a6a192d0

如果您在 Access 中打开测试数据库

eclipselink-flush-test-master\src\test\db\PairedDown-2000.mdb

然后在设计视图中打开 TABLE1 你会看到 DOUBLE_RESULT 字段实际上定义为 Single

当我将该字段更改为 Double 并重新 运行 您的测试项目时,问题就消失了。

由于在特定条件下镜像 hsqldb 数据库与 mdb 中持久保存的数据之间存在错位,因此这是一个严重的错误。 它间接取决于 FLOAT 数据在 hsqldb 中的管理方式。 我已经找到了解决方案,所以修复将在 3.0.5 中。我会尽快发布它,希望这周末,下周晚些时候。谢谢大家!