Jpa 第二个Ucanaccess事务不总是推送到MDB
我正在使用Ucanaccess-3.0.2和JPA(EclipseLink)。对于大多数用例,它工作得很好。但我有一个场景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
/**
* 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]列。