org.riotfamily.common.hibernate.HibernateUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.riotfamily.common.hibernate.HibernateUtils.java

Source

/* 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.
 */
package org.riotfamily.common.hibernate;

import java.io.Serializable;

import org.hibernate.EntityMode;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.metadata.ClassMetadata;
import org.riotfamily.common.beans.property.PropertyUtils;
import org.springframework.beans.PropertyAccessorUtils;

public final class HibernateUtils {

    private HibernateUtils() {
    }

    @SuppressWarnings("unchecked")
    public static <T> T get(Session session, Class<T> beanClass, String id) {
        SessionFactory sf = session.getSessionFactory();
        Serializable serialId = convertId(beanClass, id, sf);
        return (T) session.get(beanClass, serialId);
    }

    @SuppressWarnings("unchecked")
    public static Class<? extends Serializable> getIdentifierClass(Class<?> beanClass,
            SessionFactory sessionFactory) {

        return sessionFactory.getClassMetadata(beanClass).getIdentifierType().getReturnedClass();
    }

    public static Serializable convertId(Class<?> beanClass, String id, SessionFactory sessionFactory) {

        return PropertyUtils.convert(id, getIdentifierClass(beanClass, sessionFactory));
    }

    public static Serializable getId(SessionFactory sessionFactory, Object bean) {
        Class<?> clazz = Hibernate.getClass(bean);
        ClassMetadata metadata = sessionFactory.getClassMetadata(clazz);
        return metadata.getIdentifier(bean, EntityMode.POJO);
    }

    public static Serializable getIdAndSaveIfNecessary(SessionFactory sessionFactory, Object bean) {
        Serializable id = getId(sessionFactory, bean);
        if (id == null) {
            sessionFactory.getCurrentSession().save(bean);
        }
        return getId(sessionFactory, bean);
    }

    public static String getIdAsString(SessionFactory sessionFactory, Object bean) {
        Serializable id = getId(sessionFactory, bean);
        return (id != null) ? id.toString() : null;
    }

    public static boolean isPersistentProperty(SessionFactory sessionFactory, Class<?> clazz, String propertyPath) {

        int pos = PropertyAccessorUtils.getFirstNestedPropertySeparatorIndex(propertyPath);
        // Handle nested properties recursively.
        if (pos > -1) {
            String nestedProperty = propertyPath.substring(0, pos);
            String nestedPath = propertyPath.substring(pos + 1);
            Class<?> nestedClazz = PropertyUtils.getPropertyType(clazz, nestedProperty);
            return isPersistentProperty(sessionFactory, clazz, nestedProperty)
                    && isPersistentProperty(sessionFactory, nestedClazz, nestedPath);
        } else {
            try {
                ClassMetadata metadata = sessionFactory.getClassMetadata(clazz);
                if (metadata == null) {
                    return false;
                }
                return metadata.getPropertyType(propertyPath) != null;
            } catch (HibernateException e) {
                return false;
            }
        }
    }

    public static boolean queryContainsParameter(Query query, String name) {
        return query.getQueryString().matches(".+:" + name + "\\b.*");
    }

    public static void setParameter(Query query, String name, Object value) {
        if (value != null && queryContainsParameter(query, name)) {
            query.setParameter(name, value);
        }
    }
}