我有一个用于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;
答案 0 :(得分:1)
如果默认情况下可以对所有nvarchar
类型的列使用String
,则可以扩展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");
}
}
然后根据所使用的数据库类型配置这些方言。
答案 1 :(得分:0)
同一确切的类将与其他DB引擎一起使用,就Hibernate而言,它关心的大部分是方言。但是,例如,某些数据库引擎不支持ID字段的身份生成策略(根据过去的经验)。根据需要使用哪种数据库引擎,您可能需要一点点创意,但是在大多数情况下,只要您在实体类中没有任何特定于数据库引擎的代码,一切都应该正常工作精细。例如,我将项目从HSQLDB切换到SQLite,唯一不起作用的是我前面提到的身份生成。如果我是您,我将尝试使用不同的方言并全面测试所有内容。
EDIT
仅看到您的编辑,那肯定是特定于引擎的代码。在这种情况下,您确实可能需要其他实体来容纳要明确分配给每一列的特定数据类型。
祝你好运!