JPA没有persistence.xml

时间:2015-06-18 03:17:30

标签: java hibernate jpa orm persistence.xml

我正在尝试使用Guice Persist和JPA,它建议通过persistence.xml使用配置。来自以编程方式获取配置的本机Hibernate背景,是否有一种简单的方法来配置没有persistence.xml文件的JpaPersistModule,或者rump persistence.xml是否总是存在?

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

3 个答案:

答案 0 :(得分:4)

如果您使用的是高于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包必须包含您的实体类。

答案 1 :(得分:3)

假设您有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类实现。

查看this article,了解如何使用Hibernate实现这一目标。

答案 2 :(得分:0)

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

PS:配置文件可以让您的生活更轻松,所以如果可以的话,只需使用它。