Можем ли мы использовать один и тот же аннотированный класс pojo для нескольких баз данных? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть класс JAVA POJO с аннотацией гибернации для базы данных postgresql.

Теперь у меня есть требование, чтобы мы поддерживали несколько баз данных в нашем приложении. Мой вопрос: должны ли мы использовать один и тот же класс с другими базами данных (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;

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Если по умолчанию можно использовать 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");
    }
}

Затем настройте эти диалекты в зависимости от используемого типа базы данных.

0 голосов
/ 15 ноября 2018

Тот же самый точный класс будет работать с другими механизмами БД, поскольку Hibernate касается всего, о чем он заботится, большей частью является диалектом.Однако некоторые механизмы БД не поддерживают, например, стратегию создания идентификаторов для полей идентификаторов (из прошлого опыта).В зависимости от того, с какими механизмами БД вы должны работать, вам, возможно, придется немного проявить творческий подход, но, по большей части, если у вас нет какого-либо кода, специфичного для БД, в ваших классах сущностей, все должно работать простохорошо.Я, например, переключил проект с HSQLDB на SQLite, и единственное, что не сработало, - это создание идентификаторов, о которых я упоминал ранее.Если бы я был тобой, я бы экспериментировал с разными диалектами и тщательно проверял все.

РЕДАКТИРОВАТЬ

Только что увидел твою правку, и это определенно двигательконкретный код.В этом случае вам действительно могут понадобиться разные объекты для размещения конкретного типа данных, который вы хотите явно назначить каждому столбцу.

Удачи!

...