2010-03-09 18 views
3

因此,最后的范围蠕变来了一天:因为我们使用Hibernate,我们可以使我们的Web应用程序运行在Oracle和MySQL上,可互换吗?使我的web应用程序与数据库不可知与休眠

我认为这将是一个简单的情况下更改hibernate.cfg.xml,以便不用明确说明MySQL特定的选项,它会引用一个JNDI数据源,允许应用程序构建而不管我们打算部署的数据库至。然后,更改为不同的数据库将意味着更改JBoss,Jetty,WebLogic等单独的数据源配置。这是否现实?

那么,我已经尽可能在Jetty中设置它,但是现在让我绊倒的是有关hibernate.dialect没有在hibernate.cfg.xml中设置的错误。但是,如果我在那里设置方言,那么我的应用程序仍将以MySQL或Oracle的风格构建,这实际上并不是我想要的。

要么我试图尝试不可能或者我错过了根本明显的东西......其他人有类似的问题(和后续的解决方案/解决方法)?

回答

3

Ah - no。方言只是一个配置项目。当然,应用程序需要重新配置其他数据库。

它基本上定义了SQL生成器(即传出SQL的样子)并触发应用程序中没有更改。与数据库连接字符串类似。

原因:即使SQL Server对不同版本可能有不同的方言。

+0

啊,好的。谢谢你让我离开那个盲人的小巷! :-) – JellyHead 2010-03-09 10:52:13

0

虽然你可以(实际上应该在一个容器中进行部署时)配置Hibernate使用在应用服务器层面JNDI数据源(从而设置驱动类名,数据库URL,数据库的用户名和密码),数据库仍然具有特定性(列类型,专有语法和特定功能,如MySQL中的自动增量列,Oracle中的序列等),Hibernate必须考虑这些因素。这正是SQL Dialects的目的。所以如果你想改变数据库(如果你的映射或注释是可移植的,我想在这里创建id),你至少要设置正确的方言。

0

你仍然可以动态地做到这一点。在初始化配置/会话工厂之前,使用JNDI打开与数据源的直接连接。然后使用connection.getMetaData().getDatabaseProductName()或其他JDBC调用来找出连接使用的数据库,并相应地设置方言,例如, hibernateConfiguration.setProperty(Environment.DIALECT, deducedDialect)

我有一个可以在SQL Server,Oracle,MySQL,DB2和Informix中运行的应用程序。如果您可以控制数据模型并使事情简单化,那么内置的方言就足够了。但是,在某些情况下,您需要扩展方言以利用更多高级功能。