All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.rapidoid.jpa.JPA Maven / Gradle / Ivy

There is a newer version: 5.5.5
Show newest version
package org.rapidoid.jpa;

import org.rapidoid.RapidoidThing;
import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.cls.Cls;
import org.rapidoid.ctx.Ctx;
import org.rapidoid.ctx.Ctxs;
import org.rapidoid.u.U;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.metamodel.EntityType;
import java.util.List;
import java.util.Map;

/*
 * #%L
 * rapidoid-jpa
 * %%
 * Copyright (C) 2014 - 2016 Nikolche Mihajlovski and contributors
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

@Authors("Nikolche Mihajlovski")
@Since("5.1.0")
public class JPA extends RapidoidThing {

	public static EntityManager em() {
		return JPAUtil.em();
	}

	public static EntityManager currentEM() {
		return JPAUtil.currentEntityManager();
	}

	public static JPATool with(EntityManager em) {
		return new JPATool(em, true);
	}

	private static JPATool tool() {
		Ctx ctx = Ctxs.get();

		if (ctx != null) {
			EntityManager em = ctx.persister();
			return new JPATool(em, true);

		} else {
			EntityManagerFactory emf = JPAUtil.emf();
			U.notNull(emf, "JPA.emf");
			EntityManager em = emf.createEntityManager();
			return new JPATool(em, false);
		}
	}

	public static  E reference(Class clazz, Object id) {
		JPATool jpa = tool();
		try {
			return jpa.reference(clazz, id);
		} finally {
			jpa.done();
		}
	}

	public static  E get(Class clazz, Object id) {
		JPATool jpa = tool();
		try {
			return jpa.get(clazz, id);
		} finally {
			jpa.done();
		}
	}

	public static  T getIfExists(Class clazz, Object id) {
		JPATool jpa = tool();
		try {
			return jpa.getIfExists(clazz, id);
		} finally {
			jpa.done();
		}
	}

	public static  List getAllEntities() {
		JPATool jpa = tool();
		try {
			return jpa.getAllEntities();
		} finally {
			jpa.done();
		}
	}

	public static  E save(E record) {
		JPATool jpa = tool();
		try {
			return jpa.save(record);
		} finally {
			jpa.done();
		}
	}

	public static  E insert(E entity) {
		JPATool jpa = tool();
		try {
			return jpa.insert(entity);
		} finally {
			jpa.done();
		}
	}

	public static  E update(E record) {
		JPATool jpa = tool();
		try {
			return jpa.update(record);
		} finally {
			jpa.done();
		}
	}

	public static void delete(Object record) {
		JPATool jpa = tool();
		try {
			jpa.delete(record);
		} finally {
			jpa.done();
		}
	}

	public static  void delete(Class clazz, Object id) {
		JPATool jpa = tool();
		try {
			jpa.delete(clazz, id);
		} finally {
			jpa.done();
		}
	}

	public static void refresh(Object entity) {
		JPATool jpa = tool();
		try {
			jpa.refresh(entity);
		} finally {
			jpa.done();
		}
	}

	public static  E merge(E entity) {
		JPATool jpa = tool();
		try {
			return jpa.merge(entity);
		} finally {
			jpa.done();
		}
	}

	public static void detach(Object entity) {
		JPATool jpa = tool();
		try {
			jpa.detach(entity);
		} finally {
			jpa.done();
		}
	}

	public static void flush() {
		JPATool jpa = tool();
		try {
			jpa.flush();
		} finally {
			jpa.done();
		}
	}

	public static void bootstrap(String[] path, Class... providedEntities) {
		JPAUtil.bootstrap(path, providedEntities);
	}

	public static void transaction(Runnable action) {
		transaction(action, false);
	}

	public static void transaction(Runnable action, boolean readOnly) {
		Ctx ctx = Ctxs.get();
		boolean newContext = ctx == null;

		if (newContext) {
			ctx = Ctxs.open("transaction");
		}

		try {
			EntityManager em = ctx.persister();
			JPA.with(em).transactional(action, readOnly);

		} finally {
			if (newContext) {
				Ctxs.close();
			}
		}
	}

	public static boolean isLoaded(Object entity) {
		JPATool jpa = tool();
		try {
			return jpa.isLoaded(entity);
		} finally {
			jpa.done();
		}
	}

	public static boolean isLoaded(Object entity, String attribute) {
		JPATool jpa = tool();
		try {
			return jpa.isLoaded(entity, attribute);
		} finally {
			jpa.done();
		}
	}

	public static Object getIdentifier(Object entity) {
		JPATool jpa = tool();
		try {
			return jpa.getIdentifier(entity);
		} finally {
			jpa.done();
		}
	}

	public static boolean isEntity(Object obj) {
		return JPAUtil.isEntity(obj);
	}

	public static List> getEntityTypes() {
		JPATool jpa = tool();
		try {
			return jpa.getEntityTypes();
		} finally {
			jpa.done();
		}
	}

	public static List entities() {
		return JPAUtil.entities;
	}

	public static List> getEntityJavaTypes() {
		return JPAUtil.entityJavaTypes;
	}

	public static EntityManagerFactory provideEmf() {
		EntityManagerFactory emf = JPAUtil.emf;
		U.notNull(emf, "JPA.emf");
		return emf;
	}

	public static EntityManagerFactory getEmf() {
		return JPAUtil.emf;
	}

	public static void setEmf(EntityManagerFactory emf) {
		JPAUtil.emf(emf);
	}

	public static  T unproxy(T entity) {
		return JPAUtil.unproxy(entity);
	}

	public static boolean isActive() {
		return JPAUtil.emf() != null;
	}

	public static  Entities of(Class clazz) {
		JPATool jpa = tool();
		try {
			return jpa.of(clazz);
		} finally {
			jpa.done();
		}
	}

	public static long count(Class clazz) {
		JPATool jpa = tool();
		try {
			return jpa.count(clazz);
		} finally {
			jpa.done();
		}
	}

	public static  Entities find(CriteriaQuery criteria) {
		JPATool jpa = tool();
		try {
			return jpa.find(criteria);
		} finally {
			jpa.done();
		}
	}

	public static void bind(Query query, Map namedArgs, Object... args) {
		if (args != null) {
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i + 1, args[i]);
			}
		}

		if (namedArgs != null) {
			for (Parameter param : query.getParameters()) {
				String name = param.getName();
				if (U.notEmpty(name)) {
					U.must(namedArgs.containsKey(name), "A named argument wasn't specified for the named JPQL parameter: %s", name);
					query.setParameter(name, Cls.convert(namedArgs.get(name), param.getParameterType()));
				}
			}
		}
	}

	public static JPQL jpql(String jpql) {
		return new JPQL(jpql);
	}

	public static JPQL jpql(String jpql, Object... args) {
		return new JPQL(jpql).bind(args);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy