使用Hibernate使我的webapp与数据库无关

时间:2010-03-09 10:26:23

标签: hibernate orm

所以最近的范围 - 蠕变在前几天出现了:既然我们正在使用Hibernate,我们是否可以让我们的webapp在Oracle和MySQL上运行,可以互换?

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

好吧,我在Jetty中设置了这个,但是现在绊倒我的是关于hibernate.dialect没有在hibernate.cfg.xml中设置的错误。但是如果我在那里设置方言,那么我的应用程序仍将以MySQL或Oracle风格构建,这不是我想要的。

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

3 个答案:

答案 0 :(得分:3)

啊 - 不。方言只是一个配置项。当然,需要为另一个数据库重新配置应用程序。

它基本上定义了SQL生成器(即传出SQL的外观)并且不会在应用程序中触发任何更改。与数据库连接字符串类似。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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