pui.getProperties().setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false"); pui.setTransactionType(newPU.getTransactionType()); if (newPU.getPersistenceProviderClassName() != null) { pui.setPersistenceProviderClassName(newPU.getPersistenceProviderClassName());
@Test public void testApplicationManagedEntityManagerWithJtaTransaction() throws Exception { Object testEntity = new Object(); // This one's for the tx (shared) EntityManager sharedEm = mock(EntityManager.class); given(sharedEm.getTransaction()).willReturn(new NoOpEntityTransaction()); // This is the application-specific one EntityManager mockEm = mock(EntityManager.class); given(mockEmf.createEntityManager()).willReturn(sharedEm, mockEm); LocalContainerEntityManagerFactoryBean cefb = parseValidPersistenceUnit(); MutablePersistenceUnitInfo pui = ((MutablePersistenceUnitInfo) cefb.getPersistenceUnitInfo()); pui.setTransactionType(PersistenceUnitTransactionType.JTA); JpaTransactionManager jpatm = new JpaTransactionManager(); jpatm.setEntityManagerFactory(cefb.getObject()); TransactionStatus txStatus = jpatm.getTransaction(new DefaultTransactionAttribute()); EntityManagerFactory emf = cefb.getObject(); assertSame("EntityManagerFactory reference must be cached after init", emf, cefb.getObject()); assertNotSame("EMF must be proxied", mockEmf, emf); EntityManager em = emf.createEntityManager(); em.joinTransaction(); assertFalse(em.contains(testEntity)); jpatm.commit(txStatus); cefb.destroy(); verify(mockEm).joinTransaction(); verify(mockEm).contains(testEntity); verify(mockEmf).close(); }
@Override protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { try { Field persistenceUnitInfosField = DefaultPersistenceUnitManager.class.getDeclaredField("persistenceUnitInfos"); persistenceUnitInfosField.setAccessible(true); Map<String, MutablePersistenceUnitInfo> persistenceUnitInfos = (Map<String, MutablePersistenceUnitInfo>) persistenceUnitInfosField.get(this); if(persistenceUnitInfos.isEmpty()){ pui.setPersistenceUnitName(mergedPersistenceUnitName); pui.setTransactionType(transactionTypeOverride); }else{ MutablePersistenceUnitInfo currentlyMergedPui = persistenceUnitInfos.get(mergedPersistenceUnitName); for(String className:pui.getManagedClassNames()){ currentlyMergedPui.getManagedClassNames().add(className); } } } catch (Exception e) { throw new RuntimeException("Error while merging persistence units.",e); } super.postProcessPersistenceUnitInfo(pui); }
@Override protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { try { Field persistenceUnitInfosField = DefaultPersistenceUnitManager.class.getDeclaredField("persistenceUnitInfos"); persistenceUnitInfosField.setAccessible(true); Map<String, MutablePersistenceUnitInfo> persistenceUnitInfos = (Map<String, MutablePersistenceUnitInfo>) persistenceUnitInfosField.get(this); if(persistenceUnitInfos.isEmpty()){ pui.setPersistenceUnitName(mergedPersistenceUnitName); pui.setTransactionType(transactionTypeOverride); }else{ MutablePersistenceUnitInfo currentlyMergedPui = persistenceUnitInfos.get(mergedPersistenceUnitName); for(String className:pui.getManagedClassNames()){ currentlyMergedPui.getManagedClassNames().add(className); } } } catch (Exception e) { throw new RuntimeException("Error while merging persistence units.",e); } super.postProcessPersistenceUnitInfo(pui); }