使用 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 中。我会尽快发布它,希望这周末,下周晚些时候。谢谢大家!
我有一个项目使用 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 中。我会尽快发布它,希望这周末,下周晚些时候。谢谢大家!