第二次Ucanaccess交易并不总是被推送到MDB

时间:2015-12-13 11:20:37

标签: jpa eclipselink ucanaccess

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

  1. 开始交易
  2. 更新一行
  3. 提交交易
  4. 开始新的交易
  5. 再次更新同一行
  6. 提交第二笔交易。
  7. 此时,第二个事务中的数据在查询时(在新事务中)可见,但如果我关闭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。

    例如,从Entry{eventId=1, athleteId=1}开始并更新为Entry{eventId=1, athleteId=1, time=12.34}即可。如果我更新到Entry{eventId=1, athleteId=1, time=23.45},它将根据JPA EntityManager上的查询而保留,但不会持久存在于MDB中。但是,如果我更新为Entry{eventId=1, athleteId=1, time=23.45, dqCode='XX'}保留给MDB。

    这可能是因为已对中间HSQL DB进行了更改并且尚未写入MDB吗?

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

2 个答案:

答案 0 :(得分:2)

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

在提交事务时,我没有关闭EntityManager。因此,在某些情况下,交易正在回收。

自我注意:始终关闭EntityManager。

答案 1 :(得分:1)

请注意,您可能必须关闭并重新打开MS Access才能查看数据是否仍然存在。 UCanAccess使用Jackcess更新Access数据库,Jackcess直接修改数据库文件而不使用Access数据库引擎。因此,MS Access可能无法“看到”更改,直到它被关闭并重新打开。

如果在UCanAccess上调用了提交,它总是刷新并保留Access数据库中的数据。绝对不可能推迟刷新,至少就UCanAccess层而言。也许对更高级别代码的审查可能会揭示您正在经历的行为的可能解释。