如何在 MS Access 中使用 Hibernate?

18

我想在MS Access中使用Hibernate。我应该使用哪种方言,并且你能否给我提供一个带有MS Access的Hibernate配置文件示例?


如果您不介意的话,为什么不考虑切换到另一个数据库,比如SQLite呢? - Vincent Ramdhanie
虽然我认为寻找其他替代方案是一个好建议,但SQLite可能不是“最佳”选择,因为它在Hibernate方面得到的支持不够好(即使存在像http://code.google.com/p/hibernate-sqlite/这样的东西)。 - Pascal Thivent
1
听起来@VincentRamdhanie从未在公司环境中工作 :D - Charles Wood
5个回答

15

实际解决方案在这里!

尝试了不同的解决方案(ODBC,HXTT等)一天后,我找到了这个美妙的东西 :) http://ucanaccess.sourceforge.net/site.html

它再简单不过了:只需将网站上的JAR添加到您的项目库中即可。

META-INF/persistence.xml

<?xml version="1.0" encoding="utf-8"?>
<persistence>
    <persistence-unit name="traderMandate">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.connection.url" value="jdbc:ucanaccess://C:/MY.accdb;" />
            <property name="hibernate.connection.driver_class" value="net.ucanaccess.jdbc.UcanaccessDriver"/>
            <property name="hibernate.archive.autodetection" value="class" />
        </properties>
    </persistence-unit>
</persistence>          

Spring配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="traderMandate"/>
</bean>

<tx:annotation-driven/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

然后你就可以开始了。 ;)


在使用这种方法时,org.hibernate.dialect.SQLServerDialect是否真的是正确的方言? - JWill
这是我的工作解决方案中的复制粘贴示例。我认为驱动程序基本上像适配器一样,使accdb文件与SQLServerDialect兼容。 - Gergely Kovács
@GergelyKovács 你好,我知道这个问题很旧了,但是你的程序一直都工作得好吗?我尝试了一下,但是有些查询会出现SqlSyntaxErrorException。 - Anh Tuấn Phạm

14

对于MS Access,您需要使用来自HXTT的方言。您需要使用由HXTT提供的Hibernate支持包。还有一个示例项目,您可以查看完整的工作示例。

下面是一个最小配置的示例:

# Hxtt Access dialect sample
hibernate.dialect=com.hxtt.support.hibernate.HxttAccessDialect
hibernate.connection.driver_class=com.hxtt.sql.access.AccessDriver
hibernate.connection.url=jdbc:access:///c:/yourAccessDirectory

注:如果 MS Access 不是必需的,也许你应该考虑使用其他东西,比如......任何其他东西。


5
PS 加 1 分。如果可以的话,你还会因为真正回答了问题而再加 1 分。 - Vincent Ramdhanie
1
-1 对于没有任何解释的 PS,可能有很多应用程序使用 Hibernate,而使用文件服务器数据存储(如 Jet/ACE)并不不合适。 - David-W-Fenton
1
@David,Hibernate 的非官方支持难道不够好吗?对我来说已经足够了,我不想依赖第三方的方言提供者。 - Pascal Thivent
3
@Pascal Thivent:付费解决方案并非唯一解,因为如果您这样想,只需支付10000美元给某个公司就能解决所有问题。很多人在寻找免费解决方案,我们会继续寻找...(http://stackoverflow.com/questions/10618065/using-hibernate-with-ms-access-2007-database-free-jdbc-driver) - Quentin T.

1
作为一份后期注释(无法评论):UCanAccess肯定是有效的,尽管我还没有写数据的经验。无论如何,关于要使用的方言,我运行的是
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

因为 UCanAccess 使用 HSQLDB,而我认为该方言是最佳匹配。实际上,并没有任何 SQL 命中 MS-Access 图片中的 jackcess 直接读写访问 mdb 文件,就我所理解的情况来看,也没有任何 Microsoft 代码在任何地方解释任何 SQL,因此使用 SQLServerDialect 只会混淆 HSQLDB 代码试图理解它。

虽然UCanAccess JDBC驱动程序确实使用HSQLDB作为其后备数据库,但UCanAccess还会预处理SQL语句,尽可能地支持Access SQL方言。 UCanAccess团队希望能够为Hibernate用户提供“UCanAccessDialect”,但这只是当前待办事项清单中的众多任务之一。 - Gord Thompson
这只是为了与现有Access数据库中的现有SQL兼容,对吧?最终,SQL将被翻译成jackcess调用,我猜是这样的? - jon martin solaas
没错。意图是尽可能支持Access SQL语法。最终,UCanAccess仍将使用Jackcess API来实际更新数据库文件。 - Gord Thompson

1

1
我不知道它是否完美运作,但我进行了一个实验,使用SQLServerDialect连接msaccess数据库文件。任何人使用未经Hibernate认证的驱动程序连接数据库都存在风险。认证意味着不仅仅是连接和运行单个SELECT查询。请引用“许多人”是谁。我没有统计数据支持这种说法。 - duffymo

0

@Firstthumb。抱歉,这不是一个真正的答案,只是表达了一下评论。我曾经也面临同样的问题——考虑使用MS Access开发一个本地的2010年世界杯足球比赛竞猜。我可以直接使用Oledb访问MS Access,但作为一个培训练习,我想向一群转向.NET的Java开发人员展示nHibernate作为DAO层的用法。

在调查JBoss/Hibernate团队和其他方面的可靠和支持方言的不可用性后,我决定放弃使用MSAccess的练习。我下载了免费的SQL Express 2008。

对于那些仍然想在.NET中使用MSAccess的人,请参见this link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接