当前位置: 首页 > 知识库问答 >
问题:

我们可以对多个数据库使用同一个hibernate注释的pojo类吗?

唐兴思
2023-03-14

我有一个带有postgresql数据库Hibernate注释的JAVA POJO类。

现在,我需要在应用程序中支持多个数据库。我的问题是:我们应该在其他数据库(Oracle、MySQL、SQL Server)中使用同一个类,还是应该为每个不同的数据库编写单独的注释类?

原因:为了支持特殊字符,我们使用数据库专有类型,而不是像这样的hibernate类型

// for oracle
@Column(sql-type="nvarchar2")
private String name;

// for sql server
@Column(sql-type="nvarchar")
private String name;

// hibernate doesn't support different proprietary sql types at same type like this
@Column(sql-type={"nvarchar","nvarchar2"})
private String name;

共有2个答案

荆钱明
2023-03-14

同样的类将适用于其他数据库引擎,就HiberNate而言,它所关心的大部分是方言。然而,一些数据库引擎不支持例如ID字段的标识生成策略(从过去的经验来看)。根据您需要使用的数据库引擎,您可能需要有点创造性,但是,在大多数情况下,只要您的实体类中没有任何数据库引擎特定的代码,一切都应该正常工作。例如,我将一个项目从HSQLDB切换到SQLite,唯一不工作的是我前面提到的标识生成。如果我是你,我会尝试不同的方言,彻底测试一切。

编辑

刚刚看到你的编辑,这肯定是引擎特定的代码。在这种情况下,您可能确实需要不同的实体来容纳要显式分配给每个列的特定数据类型。

祝你好运!

傅峰
2023-03-14

如果默认情况下可以对所有String类型的列使用nvarchar,则可以扩展Oracle和MS SQLServer方言,并执行以下操作:

public class CustomOracleDialect extends org.hibernate.dialect.Oracle10gDialect {

    @Override
    protected void registerCharacterTypeMappings() {
        super.registerCharacterTypeMappings();
        registerColumnType(Types.VARCHAR, "nvarchar2");
    }
}



public class CustomSQLServerDialect extends org.hibernate.dialect.SQLServer2012Dialect {

    public CustomSQLServerDialect() {
        super();
        registerColumnType(Types.VARCHAR, "nvarchar");
    }
}

然后根据所使用的数据库类型配置这些方言。

 类似资料:
  • 问题内容: 相同的REST方法是否可以有多个注释,即执行的方法相同,但是在访问多个URL时执行? 例如:我想同时在和上运行该方法。 问题答案: 您不能在单个方法上具有多个注解。它将导致“重复注释”语法错误。 但是,有多种方法可以有效地将两个路径映射到一个方法。 @Path批注中的正则表达式 JAX-RS中的注释接受参数,可以使用正则表达式限制其值。 此注释: 将使同时针对和的请求都可以访问该方法。

  • 我正在做一个遗留的Android项目,它使用一个非常旧的Jackson lib版本来解析从我们的web API带来的JSON。 我目前正在为该项目的一个新功能,并希望使用改型与Gson库作为其JSON解析器,因为这两个库提供了更多的灵活性和更干净的代码,如果与我们以前的库选择相比。 问题是,我将需要一些遗留POJO,那些已经有杰克逊注释。将Gson和Jackson注释放在同一个类中会产生冲突吗?或

  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要

  • 问题内容: 我正在尝试配置Spring + Hibernate + JPA以使用两个数据库(MySQL和MSSQL)。 我的datasource-context.xml: 每个persistence.xml包含一个单元,如下所示: PersistenceUnitManager导致以下异常: 如果只留下一个没有列表的persistence.xml,则每个列表都可以正常工作,但我需要2个单元… 我还尝

  • 我正在尝试编写一个简单的应用程序,其中包含一个跟踪每个用户支付的款项的表和一个包含每个用户支付的总金额(所有付款的总和)的第二个表。目前,两个表都有相同的字段(firstName、lastName、金额),我已经将它们从同一个Java类映射到多个表,我无法将该类映射到多个表。对此有什么简单的解决方案吗?

  • null 最终产品应该如下所示: 在上面的例子中,@public instance将只有uniqueKey、gtin、printedGtin作为属性。