JpaCrudRepository.java
package io.extact.rms.application.persistence.jpa;
import java.util.List;
import io.extact.rms.application.domain.IdAccessable;
import io.extact.rms.application.domain.constraint.ValidationGroups.Add;
import io.extact.rms.application.domain.constraint.ValidationGroups.Update;
import io.extact.rms.application.persistence.GenericRepository;
import io.extact.rms.platform.validate.ValidateGroup;
import io.extact.rms.platform.validate.ValidateParam;
import jakarta.persistence.EntityManager;
import jakarta.validation.Valid;
public abstract class JpaCrudRepository<T extends IdAccessable> implements GenericRepository<T> {
    @Override
    public T get(int id) {
        return this.getEntityManage().find(this.getTargetClass(), id);
    }
    @Override
    public List<T> findAll() {
        var jpql = "select e from " + this.getTargetClass().getSimpleName() + " e order by e.id";
        return this.getEntityManage().createQuery(jpql, this.getTargetClass())
                .getResultList();
    }
    @ValidateParam
    @ValidateGroup(groups = Add.class)
    @Override
    public void add(@Valid T entity) {
        this.getEntityManage().persist(entity);
        this.getEntityManage().flush();
    }
    @ValidateParam
    @ValidateGroup(groups = Update.class)
    @Override
    public T update(@Valid T entity) {
        if (!this.getEntityManage().contains(entity) && get(entity.getId()) == null) {
            return null;
        }
        var updated = this.getEntityManage().merge(entity);
        this.getEntityManage().flush();
        return updated;
    }
    @Override
    public void delete(T entity) {
        this.getEntityManage().remove(entity);
        this.getEntityManage().flush();
    }
    protected abstract EntityManager getEntityManage();
    protected abstract Class<T> getTargetClass();
}