Inicialização Spring com SQLite

Inicialização Spring com SQLite

1. Visão geral

Neste tutorial rápido, seguiremos as etapas para usar um banco de dadosSQLite em um aplicativo Spring Boot habilitado para JPA.

Spring Bootsupports a few well known in-memory databasesai da caixa, mas o SQLite exige um pouco mais de nós.

Vamos dar uma olhada no que é preciso.

2. Configuração do Projeto

Para nossa ilustração,we’ll start with a Spring Data Rest app we’ve used in past tutorials.

No pom, precisamos adicionar a dependênciasqllite-jdbc:


    org.xerial
    sqlite-jdbc
    3.25.2

Essa dependência nos dá o que precisamos para usarJDBC para nos comunicarmos com o SQLite. Mas,if we are going to use an ORM, it’s not enough.

3. Dialeto SQLite

Veja,Hibernate doesn’t ship with a Dialect for SQLite. Precisamos criar um nós mesmos.

3.1. EstendendoDialect

Nossa primeira etapa é estender a classeorg.hibernate.dialect.Dialect para registrar osdata types fornecidos pelo SQLite:

public class SQLiteDialect extends Dialect {

    public SQLiteDialect() {
        registerColumnType(Types.BIT, "integer");
        registerColumnType(Types.TINYINT, "tinyint");
        registerColumnType(Types.SMALLINT, "smallint");
        registerColumnType(Types.INTEGER, "integer");
        // other data types
    }
}

Existem vários, portanto, definitivamente verifique o código de exemplo para o resto.

Em seguida, precisaremos substituir alguns comportamentos padrãoDialect.

3.2. Suporte à coluna de identidade

Por exemplo,we need to tell Hibernate how SQLite handles @Id columns, o que podemos fazer com uma implementaçãoIdentityColumnSupport personalizada:

public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl {

    @Override
    public boolean supportsIdentityColumns() {
        return true;
    }

    @Override
    public String getIdentitySelectString(String table, String column, int type)
      throws MappingException {
        return "select last_insert_rowid()";
    }

    @Override
    public String getIdentityColumnString(int type) throws MappingException {
        return "integer";
    }
}

Para manter as coisas simples aqui, vamos manter o tipo de coluna de identidade apenas paraInteger. E para obter o próximo valor de identidade disponível, especificaremos o mecanismo apropriado.

Em seguida, simplesmente substituímos o método correspondente em nossa classe crescenteSQLiteDialect:

@Override
public IdentityColumnSupport getIdentityColumnSupport() {
    return new SQLiteIdentityColumnSupport();
}

3.3. Desativar manipulação de restrições

ESQLite doesn’t have support for the database constraints, so we’ll need to disable those substituindo novamente os métodos apropriados para as chaves primária e estrangeira:

@Override
public boolean hasAlterTable() {
    return false;
}

@Override
public boolean dropConstraints() {
    return false;
}

@Override
public String getDropForeignKeyString() {
    return "";
}

@Override
public String getAddForeignKeyConstraintString(String cn,
  String[] fk, String t, String[] pk, boolean rpk) {
    return "";
}

@Override
public String getAddPrimaryKeyConstraintString(String constraintName) {
    return "";
}

E, em um momento, poderemos fazer referência a esse novo dialeto em nossa configuração Spring Boot.

4. Configuração deDataSource

Além disso, comoSpring Boot doesn’t provide configuration support for SQLite database out of the box, também precisamos expor nosso próprio beanDataSource:

@Autowired Environment env;

@Bean
public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("driverClassName"));
    dataSource.setUrl(env.getProperty("url"));
    dataSource.setUsername(env.getProperty("user"));
    dataSource.setPassword(env.getProperty("password"));
    return dataSource;
}

E, finalmente, vamos configurar as seguintes propriedades em nosso arquivopersistence.properties:

driverClassName=org.sqlite.JDBC
url=jdbc:sqlite:memory:myDb?cache=shared
username=sa
password=sa
hibernate.dialect=com.example.dialect.SQLiteDialect
hibernate.hbm2ddl.auto=create-drop
hibernate.show_sql=true

Observe que precisamos manter o cache comoshared para manter as atualizações do banco de dados visíveis em várias conexões de banco de dados.

So, with the above configurations, the app will start and will launch an in-memory database called myDb, que a configuraçãoSpring Data Rest restante pode assumir.

5. Conclusão

Neste artigo, pegamos um exemplo de aplicativo Spring Data Rest e apontamos para um banco de dados SQLite. No entanto, para fazer isso, tivemos que criar um dialeto Hibernate personalizado.

Certifique-se de verificar o aplicativoover on Github. Basta executar commvn -Dspring.profiles.active=sqlite spring-boot:run e navegar atéhttp://localhost:8080.