首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Hibernate用户类型中检测数据库?

问如何从Hibernate用户类型中检测数据库?
EN

Stack Overflow用户
提问于 2012-10-14 05:51:02
回答 1查看 3.7K关注 0票数 3

是否有一种确定从用户类型中使用的数据库的方法?我的用户类型需要根据数据库(无论是HSQL还是Oracle)向preparedStatement.setObject传递不同的对象。我计划使用来自preparedStatement的preparedStatement作为

代码语言:javascript
复制
preparedStatement.getConnection().getMetaData().getDatabaseProductName()

但我不确定是否有一组定义良好的字符串可以与上面的字符串进行比较以确定数据库。

我想要解决的更大的问题是,我们在Oracle中使用日期列,而hibernate将JodaDateTime映射到时间戳(这是唯一能够保存日期和时间的类型)。因此,Oracle在执行日期比较之前将DB中的日期值提升为时间戳。这会导致性能低下,因为数据库索引被跳过。将列类型从日期更改为时间戳的选项被排除在外,因为它需要更多的空间,而且我们的应用程序不需要超过秒的精度。因此,我计划编写一个userType,将DateTime转换为oracle.sql.DATE,并在preparedStatement中设置参数,这样就不会出现索引不匹配。(片段如下所示):

代码语言:javascript
复制
    public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
    if (value == null) {
        Hibernate.TIMESTAMP.nullSafeSet(preparedStatement, null, index);
    } else {
        preparedStatement.setObject(index, new oracle.sql.DATE(new Timestamp(((DateTime) value).getMillis())), Types.DATE);
    }
}

上述方法的问题在于,如果我使用不同的数据库进行单元测试(HSQLDB),它将无法工作,因为HSQLDialect不理解"oracle.sql.DATE“。这就是我需要从userType了解DB并在preparedStatement中设置不同对象的地方。

所以,我想知道

  • 如果有更好的方法来解决日期时间戳错配问题
  • 如果不是,如何正确地从用户类型中识别DB。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-14 07:46:57

使用Dialect.getDialect()检索当前方言。检查实例类型以了解下面的数据库.e.g:

代码语言:javascript
复制
       Dialect dialect= Dialect.getDialect();
       //<-- compare against the expected dailect classes
       if(dialect instanceof OracleDialect){  
           //your database is oracle
       }else if(dialect instanceof HSQLDialect){
        //<-- compare against the expected dailect classes
           //your database is HSQL
       }

我不太确定你的目标,但上面应该对你有帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12879649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档