根据JPA EntityManager获取实体类与表的映射关系

这篇博客深入探讨了如何使用Java的JPA(Java Persistence API),通过`@PersistenceContext`注解获取`EntityManager`,进一步获取元模型和实体持久化映射。博主展示了如何遍历实体属性,获取数据库表名、字段名及属性类型,为理解JPA在实际应用中的工作原理提供了清晰的示例。
摘要由CSDN通过智能技术生成

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]);
            }
         
        }
    }    
    
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值