com.devicehive.dao.rdbms.RdbmsGenericDao.java Source code

Java tutorial

Introduction

Here is the source code for com.devicehive.dao.rdbms.RdbmsGenericDao.java

Source

package com.devicehive.dao.rdbms;

/*
 * #%L
 * DeviceHive Dao RDBMS Implementation
 * %%
 * Copyright (C) 2016 DataArt
 * %%
 * 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%
 */

import com.devicehive.configuration.Constants;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import java.io.Serializable;
import java.util.Optional;

@Repository
public class RdbmsGenericDao {
    public static final String CACHEABLE = "org.hibernate.cacheable";
    public static final String RETRIEVE_MODE = "javax.persistence.cache.retrieveMode";
    public static final String STORE_MODE = "javax.persistence.cache.storeMode";

    @PersistenceContext(unitName = Constants.PERSISTENCE_UNIT)
    private EntityManager em;

    @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    public <T extends Serializable> T find(Class<T> entityClass, Object primaryKey) {
        return em.find(entityClass, primaryKey);
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public <T extends Serializable> void persist(T entity) {
        em.persist(entity);
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public <T extends Serializable> T merge(T entity) {
        return em.merge(entity);
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public <T extends Serializable> void remove(T entity) {
        em.remove(entity);
    }

    public <T extends Serializable> T reference(Class<T> entityClass, Object primaryKey) {
        return em.getReference(entityClass, primaryKey);
    }

    public <T extends Serializable> TypedQuery<T> createNamedQuery(Class<T> entityClass, String queryName,
            Optional<CacheConfig> cacheConfig) {
        TypedQuery<T> query = em.createNamedQuery(queryName, entityClass);
        cacheQuery(query, cacheConfig);
        return query;
    }

    public Query createNamedQuery(String queryName, Optional<CacheConfig> cacheConfig) {
        Query query = em.createNamedQuery(queryName);
        cacheQuery(query, cacheConfig);
        return query;
    }

    public void cacheQuery(Query query, Optional<CacheConfig> cacheConfig) {
        if (cacheConfig.isPresent()) {
            query.setHint(CACHEABLE, true);
            query.setHint(RETRIEVE_MODE, cacheConfig.get().getRetrieveMode());
            query.setHint(STORE_MODE, cacheConfig.get().getStoreMode());
        }
    }

    public CriteriaBuilder criteriaBuilder() {
        return em.getCriteriaBuilder();
    }

    public <T extends Serializable> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {
        return em.createQuery(criteriaQuery);
    }

}