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; }
}
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; }
}
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> {
}
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));
}
}
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();
}
}
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
}
}
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