【问题标题】:can we use same hibernate annotated pojo class for multiple databases?我们可以为多个数据库使用相同的休眠注释 pojo 类吗?
【发布时间】:2018-11-15 12:52:17
【问题描述】:

我有一个用于 postgresql 数据库的带有休眠注释的 JAVA POJO 类。

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

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

这样的休眠类型
// 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;

【问题讨论】:

  • 这个@Column注解来自哪个java包和hibernate版本?
  • javax.persistence.Column 和休眠版本 5.0.2
  • 我没有找到提供sql-type 属性的注释。您是说 Column#columnDefinition 属性吗? docs.oracle.com/javaee/7/api/javax/persistence/…
  • 如果您的问题已回答,请将其标记为已回答。

标签: java hibernate pojo


【解决方案1】:

如果默认情况下可以对所有 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");
    }
}

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

【讨论】:

    【解决方案2】:

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

    编辑

    刚刚看到您的编辑,这绝对是特定于引擎的代码。在这种情况下,您可能确实需要不同的实体来适应您要显式分配给每一列的特定数据类型。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2016-10-17
      • 2011-08-08
      • 2013-06-04
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多