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.