import java.beans.PropertyDescriptor;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import org.hibernate.metamodel.internal.MetamodelImpl;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.SingleTableEntityPersister;
import org.hibernate.persister.walking.spi.AttributeDefinition;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
/**
* 单元测试基类
* */
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestTableEntity extends AbstractJUnit4SpringContextTests {
@PersistenceContext
EntityManager entityManager;
@Test
public void getTest(){
//通过EntityManager获取factory
EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
MetamodelImpl metaData = (MetamodelImpl) entityManagerFactory.getMetamodel();
Map<String, EntityPersister> persisterMap = metaData.entityPersisters();
for(Map.Entry<String,EntityPersister> entity : persisterMap.entrySet()){
Class targetClass = entity.getValue().getMappedClass();
SingleTableEntityPersister persister = (SingleTableEntityPersister)entity.getValue();
Iterable<AttributeDefinition> attributes = persister.getAttributes();
String entityName = targetClass.getSimpleName();//Entity的名称
String tableName = persister.getTableName();//Entity对应的表的英文名
System.out.println("类名:" + entityName + " => 表名:" + tableName);
//属性
for(AttributeDefinition attr : attributes){
String propertyName = attr.getName(); //在entity中的属性名称
String[] columnName = persister.getPropertyColumnNames(propertyName); //对应数据库表中的字段名
String type = "";
PropertyDescriptor targetPd = BeanUtils.getPropertyDescriptor(targetClass, propertyName);
if(targetPd != null){
type = targetPd.getPropertyType().getSimpleName();
}
System.out.println("属性名:" + propertyName + " => 类型:" + type + " => 数据库字段名:" + columnName[0]);
}
}
}
}