Skip to content

Data Initializer

Squizy provides a mechanism to seed the database with initial data when the application starts.

Not for production

SquizyDataInitializer is designed for demos, POCs, and quick prototyping. For production data initialization, use dedicated database migration tools such as Flyway or Liquibase.

SquizyDataInitializer Interface

Implement the SquizyDataInitializer interface and register it as a Spring bean:

java
@Component
public class DataInitializer implements SquizyDataInitializer {

    private final SquizyRepository<Category, Long> categoryRepository;
    private final SquizyRepository<Product, String> productRepository;

    public DataInitializer(
            final SquizyRepository<Category, Long> categoryRepository,
            final SquizyRepository<Product, String> productRepository) {
        this.categoryRepository = categoryRepository;
        this.productRepository = productRepository;
    }

    @Override
    public void initialize() {
        Category electronics = categoryRepository.save(Category.of("Electronics"));
        Category clothing = categoryRepository.save(Category.of("Clothing"));

        productRepository.save(Product.of("AB-001", "Headphones", Status.IN_STOCK,
                BigDecimal.valueOf(199.99), electronics));
    }
}

How It Works

  1. All SquizyDataInitializer beans are collected by the SquizyInitDataProcessor
  2. On ApplicationReadyEvent, they are executed in order within a single transaction
  3. A temporary security context is set up with a system user so that @OwnerField and audit trails work correctly during initialization
  4. After all initializers run, the security context is cleaned up

The initialize() method runs with @Transactional(propagation = Propagation.MANDATORY) — all initializers either succeed or fail together.

Multiple Initializers

Use Spring's @Order annotation to control execution order:

java
@Order(1)
@Component
public class MasterDataInitializer implements SquizyDataInitializer {
    @Override
    public void initialize() {
        // Create countries, states, cities...
    }
}

@Order(2)
@Component
public class DemoDataInitializer implements SquizyDataInitializer {
    @Override
    public void initialize() {
        // Create demo data (depends on master data)...
    }
}

INFO

Check for existing data before inserting when using persistent databases. The initializer runs on every application start.

See Also