JPA without persistence.xml

后端 未结 3 1235
无人共我
无人共我 2021-01-03 11:40

I\'m trying to get started with using Guice Persist and JPA, which recommends using configuration via persistence.xml. Coming from a native Hibernate background where confi

相关标签:
3条回答
  • 2021-01-03 11:59

    There is no need for persistence.xml if you are using a Spring version higher than 3.1 and you have already defined your entities classes.

    @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;
        }
    }
    

    Note: com.demoJPA.model package must contain your entities classes.

    0 讨论(0)
  • 2021-01-03 12:12

    Depending on what you want to achieve and in what context (ApplicationServer vs CLI, CMT transactions vs EntityTransactions), it may be possible to use JPA without a persistence.xml. I did this in a CLI Java application, where I had different databases with the same structure. For that I constructed the EntityManagerFactory manually.

    PS: The config file is there to make your life easier, so if you can, just use it.

    0 讨论(0)
  • 2021-01-03 12:16

    Assuming that you have a PersistenceProvider implementation (e.g. Hibernate), you can use the PersistenceProvider#createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) method to bootstrap an EntityManagerFactory without needing a persistence.xml.

    However, it's annoying that you have to implement the PersistenceUnitInfo interface, so you are better off using Spring or Hibernate which both support bootstrapping JPA without a persistence.xml file:

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

    Where the PersistenceUnitInfo is implemented by the Spring-specific MutablePersistenceUnitInfo class.

    Check out this article for a nice demonstration of how you can achieve this goal with Hibernate.

    0 讨论(0)
提交回复
热议问题