Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 第二个Ucanaccess事务不总是推送到MDB_Jpa_Eclipselink_Ucanaccess - Fatal编程技术网

Jpa 第二个Ucanaccess事务不总是推送到MDB

Jpa 第二个Ucanaccess事务不总是推送到MDB,jpa,eclipselink,ucanaccess,Jpa,Eclipselink,Ucanaccess,我正在使用Ucanaccess-3.0.2和JPA(EclipseLink)。对于大多数用例,它工作得很好。但我有一个场景 启动交易 更新一行 提交事务 启动新事务 再次更新同一行 提交第二个事务 此时,第二个事务中的数据在查询时可见(在新事务中),但如果我关闭EntityManagerFactory并打开MDB,则第二个事务尚未持久化 实体由以下内容描述: /** * Primary Key of an Entry. */ @Embeddable public class EntryPK

我正在使用Ucanaccess-3.0.2和JPA(EclipseLink)。对于大多数用例,它工作得很好。但我有一个场景

  • 启动交易
  • 更新一行
  • 提交事务
  • 启动新事务
  • 再次更新同一行
  • 提交第二个事务
  • 此时,第二个事务中的数据在查询时可见(在新事务中),但如果我关闭EntityManagerFactory并打开MDB,则第二个事务尚未持久化

    实体由以下内容描述:

    /**
     * Primary Key of an Entry.
     */
    @Embeddable
    public class EntryPK implements Serializable {
    
        @Column(name = "Event", updatable = false)
        Integer eventId;
    
        @Column(name = "Athlete_no", updatable = false, insertable = false)
        Integer athleteId;
    }
    
    /**
     * My entity.
     */
    @Entity
    @Table(name = "Entry")
    public class Entry {
    
        @EmbeddedId
        private EntryPK privateKey;
    
        @Column(name = "Event", updatable = true)
        private Integer eventId;
    
        @Column(name = "Athlete_no", updatable = true)
        private Integer athleteId;
    
        @Column(name = "Time")
        private Double time; // In seconds
    
        @Column(name = "DQCODE")
        private String dqCode;
    }
    
    注意:如果记录为空或正在清除记录,则事务将持续。但是,如果记录中已经有一些数据,那么它并不总是持久的。其100%可重复,不间断。但是,记录中数据的先前状态会影响下一次提交是否会持续到MDB

    例如,从
    条目{eventId=1,athleteId=1}
    开始,更新到
    条目{eventId=1,athleteId=1,time=12.34}
    将起作用。如果我随后更新到
    条目{eventId=1,athleteId=1,time=23.45}
    ,它将根据JPA EntityManager上的查询保持,但将不会保持到MDB。但是如果我改为更新到
    条目{eventId=1,athleteId=1,time=23.45,dqCode='XX'}
    它将持续到MDB

    这是否可能是因为已对中间HSQL DB进行了更改,但尚未写入MDB


    如果是这样,我如何确保事务被推送到MDB?

    请注意,您可能必须关闭并重新打开MS Access才能看到持久化的数据。UCanAccess使用更新Access数据库,Jackccess直接修改数据库文件而不使用Access数据库引擎。因此,MS Access在关闭并重新打开之前可能无法“看到”更改


    如果在UCanAccess上调用了提交,它将始终刷新并持久化Access数据库中的数据。至少就UCanAccess层而言,不可能推迟冲洗。也许对更高级别代码的审查可能会揭示您所经历行为的可能解释。

    好的,解决方案很简单(感谢@GordThompson的帮助)

    在提交事务时,我没有关闭EntityManager。因此,在某些情况下,事务会被卷回


    self注意:始终关闭EntityManager。

    提交时,MDB永远不会在其他位置打开。我们随后打开它检查结果。根据EntityManager,提交显然已经发生,但没有到达MDB。我怀疑UCanAccess正在放弃辅助更新,因为只有一列已更改,并且没有为表定义主键。同时,是否还有另一条记录与为更新检查的记录相同?@William re:“没有为表定义主键”-请回答您的问题,解释您是如何配置实体的。我刚刚尝试重新创建您的问题,但EclipseLink在启动时失败,因为“实体类[class com.example.so34250537.Todo]未指定主键”。在这种情况下,a对于理解问题至关重要。@GordThompson我已更新了问题,并提供了一个示例。在JPA中为实体定义了一个主键。我的意思是MS Access表没有定义明确的主键索引。@William-我无法使用测试代码用UCanAccess 3.0.3重新创建您的问题。第二个事务实际上会提交回.mdb数据库文件,即使我只更新了[time]列。