Spring Data JPA如何无需配置文件将实体注册到Hibernate?
问题解答
Spring Data JPA如何注册扫描到的实体
Spring Data JPA并没有直接用Configuration.addAnnotatedClass()这种逐个添加实体的方式,而是通过整合Hibernate的元数据构建机制实现批量注册:
- 借助
@EntityScan注解指定实体包路径,Spring会自动扫描这些包下标注了@Entity、@Embeddable等注解的类; - 通过Hibernate的
MetadataSources和MetadataBuilder替代传统Configuration类来构建实体元数据; - 最终基于元数据生成
SessionFactory,整个过程由Spring封装完成,无需开发者手动调用添加实体的API。
Hibernate自身实现实体自动扫描的方式
其实Hibernate本身支持实体包扫描,只是传统Configuration类没有直接暴露相关API,推荐使用Hibernate 5+引入的MetadataSources来实现:
方式1:通过代码扫描指定包
if (sessionFactory == null) { // 构建服务注册中心 StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml") .build(); // 初始化元数据源 MetadataSources sources = new MetadataSources(registry); // 扫描指定包下的所有实体类(自动识别@Entity注解) sources.addPackage("com.yourproject.entity"); // 构建元数据并创建SessionFactory Metadata metadata = sources.getMetadataBuilder().build(); sessionFactory = metadata.buildSessionFactory(); }
方式2:通过hibernate.cfg.xml配置包扫描
直接在配置文件中添加包映射,无需修改代码:
<hibernate-configuration> <session-factory> <!-- 其他配置项 --> <mapping package="com.yourproject.entity"/> </session-factory> </hibernate-configuration>
需要注意:addPackage()或<mapping package>会扫描对应包下的package-info.java(若存在),同时自动加载该包及其子包下所有标注了@Entity、@MappedSuperclass、@Embeddable的类,实现实体的自动注册。
内容的提问来源于stack exchange,提问作者Abdalrazag Al-Shrufat
相关产品推荐
相关产品推荐

