For JPA to work, we need to define a persistence.xml inside META-INF. I always found it pretty cumbersome and difficult to maintain. Especially so for my integration tests. Wouldn't it be cool if we could do everything from Java code?
Here you go:
private EntityManager createEntityManager(String dbUrl, String dbUser, String dbPassword) { Properties props = new Properties(); props.put("hibernate.connection.url", dbUrl); props.put("hibernate.connection.username", dbUser); if (StringUtils.hasText(dbPassword)) { props.put("hibernate.connection.password", dbPassword); } PersistenceUnitInfo persistenceUnitInfo = new PersistenceUnitInfo() { @Override public Properties getProperties() { return props; } @Override public ListgetManagedClassNames() { return Arrays.asList(Author.class.getName(), Book.class.getName(), Chapter.class.getName(), Genre.class.getName(), Section.class.getName()); } @Override public String getPersistenceUnitName() { return "TestUnit"; } @Override public String getPersistenceProviderClassName() { return HibernatePersistenceProvider.class.getName(); } @Override public PersistenceUnitTransactionType getTransactionType() { return null; } @Override public DataSource getJtaDataSource() { return null; } @Override public DataSource getNonJtaDataSource() { return null; } @Override public List getMappingFileNames() { return null; } @Override public List getJarFileUrls() { return null; } @Override public URL getPersistenceUnitRootUrl() { return null; } @Override public boolean excludeUnlistedClasses() { return false; } @Override public SharedCacheMode getSharedCacheMode() { return null; } @Override public ValidationMode getValidationMode() { return null; } @Override public String getPersistenceXMLSchemaVersion() { return null; } @Override public ClassLoader getClassLoader() { return null; } @Override public void addTransformer(ClassTransformer transformer) { } @Override public ClassLoader getNewTempClassLoader() { return null; } }; HibernatePersistenceProvider hibernatePersistenceProvider = new HibernatePersistenceProvider(); EntityManagerFactory entityManagerFactory = hibernatePersistenceProvider .createContainerEntityManagerFactory(persistenceUnitInfo, Collections.EMPTY_MAP); return entityManagerFactory.createEntityManager(); }
private EntityManager createEntityManager(String dbUrl, String dbUser, String dbPassword) { MutablePersistenceUnitInfo mutablePersistenceUnitInfo = new MutablePersistenceUnitInfo() { @Override public ClassLoader getNewTempClassLoader() { return null; } }; mutablePersistenceUnitInfo.setPersistenceUnitName("TestUnit"); mutablePersistenceUnitInfo.setPersistenceProviderClassName(HibernatePersistenceProvider.class.getName()); Properties props = new Properties(); props.put("hibernate.connection.url", dbUrl); props.put("hibernate.connection.username", dbUser); if (StringUtils.hasText(dbPassword)) { props.put("hibernate.connection.password", dbPassword); } mutablePersistenceUnitInfo.setProperties(props); mutablePersistenceUnitInfo.addManagedClassName(Author.class.getName()); mutablePersistenceUnitInfo.addManagedClassName(Book.class.getName()); mutablePersistenceUnitInfo.addManagedClassName(Chapter.class.getName()); mutablePersistenceUnitInfo.addManagedClassName(Genre.class.getName()); mutablePersistenceUnitInfo.addManagedClassName(Section.class.getName()); PersistenceUnitDescriptor persistenceUnitDescriptor = new PersistenceUnitInfoDescriptor( mutablePersistenceUnitInfo); EntityManagerFactoryBuilder entityManagerFactoryBuilder = new EntityManagerFactoryBuilderImpl( persistenceUnitDescriptor, Collections.EMPTY_MAP); EntityManagerFactory entityManagerFactory = entityManagerFactoryBuilder.build(); return entityManagerFactory.createEntityManager(); }
Note that you can add your entities through code. In order for this to compile, you would need to include the below dependencies in maven:
org.springframework.boot spring-boot-starter-data-jpa
The complete sources can be found here:
https://github.com/paawak/blog/tree/master/code/one-to-many-example-2
This particular Java file is:
https://github.com/paawak/blog/blob/master/code/one-to-many-example-2/src/test/java/com/swayam/demo/spring/springbootdemo/JpaIntegrationTest.java