使用 EclipseLink 和 UCanAccess 的持久性错误

Posted

技术标签:

【中文标题】使用 EclipseLink 和 UCanAccess 的持久性错误【英文标题】:Error with persistence using EclipseLink and UCanAccess 【发布时间】:2016-07-01 09:47:20 【问题描述】:

出于锻炼原因,我正在尝试开发应用程序。我使用 MSAccess 2010 作为数据库,使用 UCanAccess (3.06) 作为驱动程序,使用 EclipseLink 2.1 作为实体框架。

我一直在向数据库添加新记录。这里是错误代码:

Internal Exception: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 user lacks privilege or object not found: IDENTITY_VAL_LOCAL
Error Code: -5501
Call: SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
Query: ValueReadQuery(name="SEQ_GEN_IDENTITY" sql="SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1")

在我看来,id 的自动生成失败了。实体类是通过 Netbeans 生成的,如下所示:

@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;

【问题讨论】:

【参考方案1】:

默认情况下,EclipseLink 会尝试自动检测底层数据库并使用适当的 SQL 方言生成 SQL 语句。这显然对您不起作用,因为用于检索最后创建的标识值的 SQL 语句未被 UCanAccess 识别。

您可以尝试将target-database 指令添加到指定SQLServer 的EclipseLink 配置中,以尝试获取有效的SQL 语句(SELECT @@IDENTITY) 来检索最后创建的ID 值。但是,请记住,T-SQL 和 Access SQL 之间存在显着差异,因此您可能会继续遇到 EclipseLink 和 UCanAccess 之间的其他兼容性问题。

【讨论】:

【参考方案2】:

在知道上述答案之前,我在访问数据库中插入新记录时也面临同样的问题, 感谢先生。 Gord Thompson 为我提供了一个很好的解决方案, 而且它也在工作。

我刚刚在我的 persistence.xml 文件中添加了一行..

property name="eclipselink.target-database" value="HSQL"

 <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
      <persistence-unit name="OnePU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>design_frames.One</class>
        <properties>
          <property name="javax.persistence.jdbc.url" value="jdbc:ucanaccess://C:\One\One.accdb"/>
          <property name="javax.persistence.jdbc.user" value=""/>
          <property name="javax.persistence.jdbc.driver" value="net.ucanaccess.jdbc.UcanaccessDriver"/>
          <property name="javax.persistence.jdbc.password" value=""/>
          <property name="eclipselink.target-database" value="HSQL"/>
        </properties>
      </persistence-unit>
    </persistence>

【讨论】:

欢迎来到 SO。为什么要添加这一行? 每当我想尝试使用 java 持久性 API(jpa) 在 Microsoft access 数据库中添加新记录时,我都面临错误“调用:SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1”插入不成功。在 persistence.xml 文件中添加以下行后,现在它工作正常

以上是关于使用 EclipseLink 和 UCanAccess 的持久性错误的主要内容,如果未能解决你的问题,请参考以下文章

EclipseLink 如何使用两个@OneToMany 和@ManyToOne 来替换@ManyToMany

Eclipselink 2.5 使用 Maven 生成元模型

在测试环境中使用 Eclipselink 和 h2 生成序列时出现异常

EclipseLink 原生查询和 FetchType 行为

eclipselink.weaving 属性的值和区别是啥?

使用 EclipseLink 处理 Spring 事务