Hibernate: 针对 Oracle 和 PostgreSQL 的映射

24 浏览
0 Comments

Hibernate: 针对 Oracle 和 PostgreSQL 的映射

我有一个要求,需要同时支持Oracle和PostgreSQL。我有以下Hibernate映射 -


    
    
        `OneTimeAccessToken_id_seq`
    


    


    

然而,这对于Oracle来说不起作用,因为它有反引号。如果我删除反引号,它就无法在PostgreSQL上工作。对于如何支持两个数据库,有什么建议吗?

我在Oracle 11.2版本中使用org.hibernate.dialect.Oracle10gDialect,是正确的吗?

我的问题是反引号,不能使序列适用于所有数据库。我已经解决了这个问题。我在hbm文件中使用了反引号,以便让PostgreSQL按照我指定的字符大小写创建表/列。如果我删除这些反引号,PostgreSQL会将所有内容转换为小写。现在,使用反引号一切在PostgreSQL上都正常工作,但是在Oracle上会出现问题,显示无法找到表或视图:"OneTimeAccessToken"。我正在努力找到解决这个问题的方法,以保持表/列名称的大小写,并使其在Oracle上正常工作。

0
0 Comments

Hibernate: Mapping for Oracle and PostgreSQL

在使用Hibernate的过程中,如果要支持两个不同的数据库,就需要使用两个不同的Hibernate配置。这样就可以解决ID生成冲突的问题,因为对于Oracle领域的类和Postgres领域的类,可以使用不同的生成器。

我已经解决了这个问题。为了解决ID生成问题,我不需要使用两个方言,只需要按照建议进行更改即可。其次,为了解决反引号问题,这是Liquibase数据库版本工具的问题。我不得不扩展他们的OracleDatabase实现,以覆盖他们的琐碎功能,并扩展OracleSnapshotGenerator实现,以覆盖Liquibase特定表的表名引用。

// 解决ID生成冲突的配置

Configuration config = new Configuration();

config.addAnnotatedClass(OracleEntity.class);

config.addAnnotatedClass(PostgresEntity.class);

SessionFactory sessionFactory = config.buildSessionFactory();

// 扩展Liquibase OracleDatabase实现

public class CustomOracleDatabase extends OracleDatabase {

// 覆盖琐碎功能

// ...

}

// 扩展Liquibase OracleSnapshotGenerator实现

public class CustomOracleSnapshotGenerator extends OracleSnapshotGenerator {

// 覆盖表名引用

// ...

}

0
0 Comments

Hibernate: Mapping for Oracle and PostgreSQL

在使用Hibernate进行Oracle和PostgreSQL的映射时,出现了一个问题。问题是在hbm文件中的反引号(back-tick)使得该文件无法与Oracle一起使用。如果我将其移除,那么就会在PostgreSQL中出现问题。我知道方言应该处理这个问题,但在我的情况下却没有。我不确定为什么会这样,需要更多的指引来进行调查。

解决方法是为此编写自己的id生成器,该生成器继承了sequence生成器,并根据方言修改序列名称。

顺便说一句,这听起来像是一个Hibernate的bug。Hibernate应该在两种情况下正确引用,你不应该自己插入引用。请报告一个Hibernate的bug,报告序列生成器名称没有被正确引用的问题。

0
0 Comments

Hibernate: Mapping for Oracle and PostgreSQL

在使用Hibernate进行Oracle和PostgreSQL的映射时,可能会出现以下问题:

1. 对于Oracle数据库,使用Oracle10gDialect进行版本11的映射时,可能会出现问题。在这种情况下,可以参考这里的解决方法,使用Oracle10gDialect进行版本11的映射是可以的。

2. 对于PostgreSQL数据库,使用注解配置可能会遇到问题。在这里有一个解决方法,可以尝试在注解配置中指定序列的名称,不需要使用任何引号。这种方法可以解决问题,但需要注意在PostgreSQL中正确配置序列。

以上是在使用Hibernate进行Oracle和PostgreSQL的映射时可能遇到的问题以及解决方法。在Oracle中使用Oracle10gDialect进行版本11的映射是可以的,而在PostgreSQL中使用注解配置时,可以尝试指定序列的名称来解决问题。希望这些解决方法对于解决你的问题有所帮助。

0