GUÍA DE REFERENCIA: ARQUITECTURA SPRING BOOT & SQLITE

Aviso de Seguridad: Este documento es de consulta visual exclusiva. La copia de texto, captura o arrastre está inhabilitada y auditada.

1. Modelo de Datos con Herencia JPA (JOINED)

Clase base abstracta con estrategia JOINED para crear tablas relacionadas en SQLite:

package empresa.model;

import jakarta.persistence.*;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class persona {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 50, nullable = false)
    private String nombre;

    @Column(length = 20, unique = true, nullable = false)
    private String dni;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getNombre() { return nombre; }
    public void setNombre(String nombre) { this.nombre = nombre; }
    public String getDni() { return dni; }
    public void setDni(String dni) { this.dni = dni; }
}

2. Subclases con Tabla Propia (extends persona)

Ejemplo de subclase cliente y repartidor que heredan de persona:

package empresa.model;

import jakarta.persistence.Entity;

@Entity
public class cliente extends persona {
    private String direccion;
    private String telefono;

    public String getDireccion() { return direccion; }
    public void setDireccion(String direccion) { this.direccion = direccion; }
    public String getTelefono() { return telefono; }
    public void setTelefono(String telefono) { this.telefono = telefono; }
}

3. Repositorios Spring Data JPA

Extienden JpaRepository<Entidad, TipoID> para operaciones CRUD automáticas:

package empresa.repositori;

import empresa.model.cliente;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface clienterepo extends JpaRepository<cliente, Long> {
}

4. Controlador RESTful (@RestController)

Mapeo de endpoints HTTP con inyección del repositorio:

package empresa.controller;

import empresa.model.cliente;
import empresa.repositori.clienterepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/api/clientes")
public class ClienteControlador {

    @Autowired
    private clienterepo repo;

    @GetMapping
    public List<cliente> listar() {
        return repo.findAll();
    }

    @PostMapping
    public ResponseEntity<cliente> crear(@RequestBody cliente c) {
        return ResponseEntity.ok(repo.save(c));
    }
}

5. Configuración de Spring Security (Seguridad 6.x)

Permite liberar rutas /api/** para pruebas desde el Probador HTTP:

package empresa.seguridad;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/**").permitAll()
                .anyRequest().authenticated()
            );
        return http.build();
    }
}

6. Inicializador de Datos (AdminSeeder)

Carga registros iniciales en la base de datos al arrancar Spring Boot:

package empresa.config;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AdminSeeder implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // Inicialización de registros iniciales SQLite si es necesario
    }
}

7. Configuración de SQLite (application.properties)

El archivo pom.xml ya viene preconfigurado con las librerías sqlite-jdbc y hibernate-community-dialects.
spring.datasource.url=jdbc:sqlite:db/materia.db
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true