
io.mateu.mdd.springboot.JPAHelperImpl Maven / Gradle / Ivy
package io.mateu.mdd.springboot;
import io.mateu.mdd.shared.JPAAdapter;
import io.mateu.mdd.shared.ui.MDDUIAccessor;
import io.mateu.util.Helper;
import io.mateu.util.IJPAHelper;
import io.mateu.util.persistence.JPAHelper;
import io.mateu.util.persistence.JPATransaction;
import io.mateu.util.runnable.RunnableThrowsThrowable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.*;
@Component
public class JPAHelperImpl implements IJPAHelper {
@Autowired
private EntityManagerFactory emf;
@PostConstruct
public void post() {
JPAHelper.set(this);
}
@Override
public void transact(JPATransaction t) throws Throwable {
transact(MDDUIAccessor.getPersistenceUnitName(), t, null);
}
@Override
public void transact(JPATransaction t, RunnableThrowsThrowable callback) throws Throwable {
transact(MDDUIAccessor.getPersistenceUnitName(), t, callback);
}
@Override
public void transact(String persistenceUnit, JPATransaction t) throws Throwable {
transact(persistenceUnit, t, null);
}
@Transactional
@Override
public void transact(String persistenceUnit, JPATransaction t, RunnableThrowsThrowable callback) throws Throwable {
try {
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
t.run(em);
em.getTransaction().commit();
} catch (Throwable e) {
e.printStackTrace();
if (em.getTransaction().isActive()) em.getTransaction().rollback();
em.close();
e = e.getCause() != null && e.getCause() instanceof ConstraintViolationException ?e.getCause():e;
if (e instanceof ConstraintViolationException) {
StringBuffer sb = new StringBuffer();
((ConstraintViolationException)e).getConstraintViolations().forEach(v -> sb.append(("".equals(sb.toString())?"":"\n") + (v.getPropertyPath() != null?v.getPropertyPath().toString() + " ":"") + v.getMessage() + (v.getRootBeanClass() != null?" en " + v.getRootBeanClass().getSimpleName() + "":"")));
e = new Exception(sb.toString());
}
rethrow(e);
}
em.close();
} catch (Throwable e) {
rethrow(e.getCause() != null && e.getCause() instanceof ConstraintViolationException?e.getCause():e);
}
}
public void rethrow(Throwable e) throws Throwable {
if (e instanceof ConstraintViolationException) {
StringBuffer sb = new StringBuffer();
for (ConstraintViolation v : ((ConstraintViolationException)e).getConstraintViolations()) {
if (sb.length() > 0) sb.append("\n");
sb.append("" + v.getPropertyPath() + " " + v.getMessage() + " at " + Helper.capitalize(v.getRootBeanClass().getSimpleName()));
}
throw new Exception(sb.toString());
} else throw e;
}
public void printStackTrace(Throwable e) {
e.printStackTrace();
if (e instanceof ConstraintViolationException) {
StringBuffer sb = new StringBuffer();
for (ConstraintViolation v : ((ConstraintViolationException)e).getConstraintViolations()) {
if (sb.length() > 0) sb.append("\n");
sb.append("" + v.getPropertyPath() + " " + v.getMessage() + " at " + Helper.capitalize(v.getRootBeanClass().getSimpleName()));
}
System.out.println(sb.toString());
}
}
@Override
public void closeEMFs() {
}
@Override
public void setEMF(EntityManagerFactory f) {
}
@Override
public EntityManagerFactory getEMF() {
return emf;
}
@Override
public EntityManagerFactory getEMF(String persistenceUnit) {
return emf;
}
@Override
public void notransact(JPATransaction t) throws Throwable {
notransact(MDDUIAccessor.getPersistenceUnitName(), t, true);
}
@Override
public void notransact(JPATransaction t, boolean printException) throws Throwable {
notransact(MDDUIAccessor.getPersistenceUnitName(), t, printException);
}
@Override
public void notransact(String persistenceUnit, JPATransaction t) throws Throwable {
notransact(persistenceUnit, t, true);
}
@Transactional(readOnly = true)
@Override
public void notransact(String persistenceUnit, JPATransaction t, boolean printException) throws Throwable {
EntityManager em = emf.createEntityManager();
try {
t.run(em);
} catch (Exception e) {
if (printException) e.printStackTrace();
em.close();
throw e;
}
em.close();
}
@Override
public T find(Class type, Object id) throws Throwable {
Object[] o = {null};
notransact(em -> {
o[0] = em.find(type, id);
});
return (T) o[0];
}
@Override
public List findAll(EntityManager em, Class type) throws Throwable {
return em.createQuery("select x from " + type.getName() + " x").setFlushMode(FlushModeType.COMMIT).getResultList();
}
@Override
public List findAll(Class type) throws Throwable {
List l = new ArrayList<>();
notransact(em -> {
l.addAll(findAll(em, type));
});
return l;
}
@Override
public List getAll(Class type) {
try {
return findAll(type);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return new ArrayList<>();
}
@Override
public T get(Class type, Object id) {
try {
return find(type, id);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
@Override
public Optional selectValue(String jpql) throws Throwable {
return selectValue(jpql, null);
}
@Override
public Optional selectValue(String jpql, Map params) throws Throwable {
List l = selectObjects(jpql, params);
return Optional.of(l.size() > 0?l.get(0):null);
}
@Override
public List selectObjects(String jpql) throws Throwable {
return selectObjects(jpql, new HashMap<>());
}
@Override
public List selectObjects(String jpql, Map params) throws Throwable {
List l = new ArrayList<>();
notransact(em -> {
Query q = em.createQuery(jpql);
Helper.getImpl(JPAAdapter.class).hint(q);
if (params != null) {
for (String k : params.keySet()) q.setParameter(k, params.get(k));
}
l.addAll(q.getResultList());
});
return l;
}
@Override
public List selectObjects(String jpql, Class targetClass) throws Throwable {
return selectObjects(jpql, new HashMap<>(), targetClass);
}
@Override
public List selectObjects(String jpql, Map params, Class targetClass) throws Throwable {
List l = new ArrayList<>();
notransact(em -> {
Query q = em.createQuery(jpql, targetClass);
Helper.getImpl(JPAAdapter.class).hint(q);
if (params != null) {
for (String k : params.keySet()) q.setParameter(k, params.get(k));
}
l.addAll(q.getResultList());
});
return l;
}
//todo: sql nativo
@Override
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy