package message.jdbc.sql;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.Table;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* 构建bean与数据库表关系的工具类.
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0
* @createTime 2012-10-8 上午04:18:37
*/
public class BeanPersistenceHelper {
private static final Logger logger = LoggerFactory.getLogger(BeanPersistenceHelper.class);
//BeanPersistenceDef的存储对象,类似缓存
private static final Map<Class<?>, BeanPersistenceDef> beanPersistenceMaps = new HashMap<Class<?>, BeanPersistenceDef>();
//同步锁
private static final Object lockObject = new Object();
private BeanPersistenceHelper() {
}
/**
* get bean persistence definition for clazz
*
* @param clazz
* @return
*/
public static BeanPersistenceDef getBeanPersistenceDef(Class<?> clazz) throws Exception {
if (clazz == null || !clazz.isAnnotationPresent(Table.class)) {
throw new SQLException("this clazz '{" + clazz.getName() + "}' is not support generic* method!");
}
BeanPersistenceDef beanPersistence = beanPersistenceMaps.get(clazz);
if (beanPersistence == null) {
beanPersistence = initialize(clazz);
}
return beanPersistence;
}
/**
* initialize this clazz, return bean persistence definition
*
* @param clazz
* @return
*/
private static BeanPersistenceDef initialize(Class<?> clazz) throws Exception {
BeanPersistenceDef beanPersistence = null;
synchronized (lockObject) {
logger.debug("beanPersistence is null, begin build it for '{}'!", clazz);
BeanPersistenceBuilder beanPersistenceBuilder = new BeanPersistenceBuilder(clazz);
beanPersistence = beanPersistenceBuilder.build();
logger.debug("build beanPersistence is '{}'!", beanPersistence);
if (beanPersistence != null) {
beanPersistenceMaps.put(clazz, beanPersistence);
}
}
return beanPersistence;
}
}