没有persistence.xml的JPA

Posted

技术标签:

【中文标题】没有persistence.xml的JPA【英文标题】:JPA without persistence.xml 【发布时间】:2015-06-18 03:17:29 【问题描述】:

我正在尝试开始使用 Guice Persist 和 JPA,它建议通过 persistence.xml 使用配置。来自以编程方式获取配置的本机 Hibernate 背景,是否有一种简单的方法可以在没有 persistence.xml 文件的情况下配置 JpaPersistModule,还是必须始终存在臀部 persistence.xml?

如果不存在这样的选项,我可能不得不使用 PersistenceProvider(假设“默认”以某种方式解析 persistence.xml)。有关于使用 JPA SPI 的教程吗?

【问题讨论】:

【参考方案1】:

如果您使用高于 3.1 的 Spring 版本并且您已经定义了实体类,则不需要 persistence.xml

@Configuration
@ComponentScan(basePackages =  "com.demoJPA.model" )
@EnableTransactionManagement
public class DemoJPAConfig 

    @Bean
    public DataSource dataSource() throws PropertyVetoException 
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("org.gjt.mm.mysql.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/cimto");
        dataSource.setUser("user");
        dataSource.setPassword("pass");

        return dataSource;
    

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws PropertyVetoException 
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setJpaVendorAdapter(vendorAdapter());
        em.setPersistenceUnitName("cimtoPU");
        em.setJpaPropertyMap(getJpaProperties());

        return em;
    

    public Map<String, ?> getJpaProperties() 
    return new HashMap<String, Object>();
    

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) 
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);

        return transactionManager;
    

    public JpaVendorAdapter vendorAdapter() 
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
    vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
        vendorAdapter.setShowSql(true);

        return vendorAdapter;
    

注意:com.demoJPA.model 包必须包含您的实体类。

【讨论】:

附加说明:可能没有编译错误,但请确保 Spring 支持匹配的 hibernate 版本。例如。 Spring 4.2 率先支持 Hibernate 5.0,Spring 4.3 率先支持 Hibernate 5.2。【参考方案2】:

假设你有一个PersistenceProvider 实现(例如Hibernate),你可以使用PersistenceProvider#createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) 方法来引导一个EntityManagerFactory 而不需要persistence.xml

但是,您必须实现 PersistenceUnitInfo 接口很烦人,因此您最好使用 Spring 或 Hibernate,它们都支持在没有 persistence.xml 文件的情况下引导 JPA:

this.nativeEntityManagerFactory = provider.createContainerEntityManagerFactory(
    this.persistenceUnitInfo, 
    getJpaPropertyMap()
);

PersistenceUnitInfo 由 Spring 特定的 MutablePersistenceUnitInfo 类实现。

【讨论】:

【参考方案3】:

根据您想要实现的目标以及在什么上下文中(ApplicationServer 与 CLI,CMT transactions 与 EntityTransactions),可能在没有 persistence.xml 的情况下使用 JPA。我是在 CLI Java 应用程序中执行此操作的,在该应用程序中,我有具有相同结构的不同数据库。为此,我手动构建了EntityManagerFactory

PS:配置文件是为了让您的生活更轻松,所以如果可以,请使用它。

【讨论】:

以上是关于没有persistence.xml的JPA的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 persistence.xml 的情况下配置 Spring?

JPA persistence.xml 和 MySQL - 没有采用正确的“hibernate.connection.url”目录

在 spring-context.xml 和 persistence.xml 中加载 .properties

没有定义[javax.persistence.EntityManagerFactory]类型的唯一bean:期望的单个bean但找到0

JPA 使用替代“persistence.xml”

Jpa 的Persistence.xml配置讲解