2009-11-17 50 views
11

我想在MS Access中使用休眠。我应该使用哪种方言,并且可以给我一个带MS Access的示例休眠配置文件?如何在MS Access中使用休眠?

+0

如果你不介意。为什么?难道不可能像SQLite那样使用另一个数据库? – 2009-11-17 15:05:58

+0

虽然我认为寻找其他东西是一个很好的建议,但SQLite可能不是“最好的”选择,因为它不被Hibernate支持(即使这样的http://code.google.com/p/hibernate- sqlite /确实存在)。 – 2009-11-17 15:20:25

+0

听起来@VincentRamdhanie从未在公司环境中工作过:D – 2016-10-05 14:37:37

回答

11

对于MS Access,您需要HXTT的方言。您需要使用HXTT提供的hibernate support package。还有一个sample project,你可以检查一个完整的工作示例。

下面,样品最低配置:

# 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 

PS:如果MS Access是不是刻在石头上的要求,也许你应该考虑使用别的东西一样......嗯,什么事。

+2

+1。如果我能,你会得到另一个实际上回答这个问题的+1。 – 2009-11-17 18:21:48

+1

-1为PS没有任何解释为什么 - 有很多应用程序,您可能会使用Hibernate,而不适合使用像Jet/ACE这样的文件服务器数据存储。 – 2009-11-17 23:51:20

+0

@David Hibernate对你来说不是非官方的支持吗?对我而言,我不想依赖第三方方言提供者。 – 2009-11-18 18:35:36

1

@Firstthumb。对不起,这不是一个真正的答案,而只是表达了一个评论。我在同一条船上 - 考虑使用MS Access为2010年世界杯足球赛制定本地小费赛事。我可以直接使用Oledb来访问MS Access,但作为一个训练练习来重振一群转向.NET的Java开发人员,我想展示nHibernate作为DAO层的用法。

在调查了JBoss/Hibernate团队中一个强大且支持的方言的不可用性和其他考虑因素后,我决定放弃使用MSAccess的练习。我下载了免费的SQL Express 2008。

对于那些谁仍然希望在.NET中使用MSACCESS,请参阅this link

1

您可以使用其他策略和免费策略来解决这个问题(HXTT是不是免费的):

http://www.programmingforfuture.com/2011/06/how-to-use-ms-access-with-hibernate.html

Personaly我试图逆向工程ms数据库时遇到异常(org.hibernate.exception.GenericJDBCException:读取主键元数据时出错),但它适用于很多人。

+1

“我不知道它在哪里工作完美,但我做了一个使用SQLServerDialect连接msaccess数据库文件的实验”。任何使用驱动程序连接到尚未经过Hibernate认证的数据库才能正常使用它们的软件的用户都面临着风险。认证意味着不仅仅是连接和运行单个SELECT查询。请引用“很多人”是谁。我没有统计数据支持这一说法。 – duffymo 2012-06-05 10:01:35

9

这里的实际解决方案!

经过1天试用不同的解决方案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> 

,你是好去。 ;)

+0

使用这种方法时,org.hibernate.dialect.SQLServerDialect真的是正确的方言吗? – JWill 2014-12-03 14:56:29

+0

是的。给出的例子是来自我的工作解决方案的复制粘贴。我假设驱动程序基本上像一个适配器和_makes_ accdb文件_SQLServerDialect-compatible_。 – 2014-12-03 15:49:51

+0

@GergelyKovács嗨,我知道这个问题很老,但你的程序一直工作得很好吗?我尝试过但是有一些查询它有SqlSyntaxErrorException – 2017-04-24 20:33:17

1

作为一个晚期笔记(评论是不适用于我):UCanAccess肯定有效,虽然我还没有(有)写数据的经验。不管怎么说,对于方言的使用,我用

  <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 

因为UCanAccess使用HSQLDB运行,我想这话是最好的搭配。这里没有任何sql实际触及ms访问,jackcess直接读取和写入访问mdb文件,没有任何微软代码可以解释任何sql的任何地方,据我所知,因此使用SQLServerDialect将会只会混淆HSQLDB代码试图理解它。

+0

UCanAccess JDBC驱动程序确实使用HSQLDB作为其后备数据库,但UCanAccess还预处理SQL语句以尝试并尽可能地支持Access SQL方言。 UCanAccess团队希望能够为Hibernate用户提供“UCanAccessDialect”,但这是目前待办事项列表中的许多事情之一。 – 2016-02-09 13:19:31

+0

这只是为了与现有的Access数据库现有的SQL兼容,对吧?尽管如此,sql最终还是会转化为jackcess-calls,我猜? – 2016-02-12 16:22:27

+0

这是正确的。目的是尽可能地支持Access SQL语法。最终,UCanAccess仍然会使用Jackcess API来实际更新数据库文件。 – 2016-02-12 16:35:12