HHH-8053 HibernateBundleActivator should not register itself as a

PersistenceProvider
This commit is contained in:
Brett Meyer 2013-03-05 16:46:21 -05:00
parent 139474624f
commit 5f8ba65ce1
2 changed files with 29 additions and 29 deletions

View File

@ -52,6 +52,16 @@ public class HibernatePersistenceProvider implements PersistenceProvider {
private final PersistenceUtilHelper.MetadataCache cache = new PersistenceUtilHelper.MetadataCache();
/**
* Used for environment-supplied properties. Ex: hibernate-osgi's
* HibernateBundleActivator needs to set a custom JtaPlatform.
*/
private Map environmentProperties;
public void setEnvironmentProperties( Map environmentProperties ) {
this.environmentProperties = environmentProperties;
}
/**
* {@inheritDoc}
* <p/>
@ -59,6 +69,9 @@ public class HibernatePersistenceProvider implements PersistenceProvider {
*/
@Override
public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
if ( environmentProperties != null ) {
properties.putAll( environmentProperties );
}
final EntityManagerFactoryBuilder builder = getEntityManagerFactoryBuilderOrNull( persistenceUnitName, properties );
return builder == null ? null : builder.build();
}
@ -100,8 +113,11 @@ public class HibernatePersistenceProvider implements PersistenceProvider {
* Note: per-spec, the values passed as {@code properties} override values found in {@link PersistenceUnitInfo}
*/
@Override
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map integration) {
return Bootstrap.getEntityManagerFactoryBuilder( info, integration ).build();
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) {
if ( environmentProperties != null ) {
properties.putAll( environmentProperties );
}
return Bootstrap.getEntityManagerFactoryBuilder( info, properties ).build();
}
@Override

View File

@ -23,18 +23,15 @@
*/
package org.hibernate.osgi;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.internal.util.ClassLoaderHelper;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.hibernate.jpa.boot.spi.Bootstrap;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
@ -46,18 +43,13 @@ import org.osgi.framework.BundleListener;
* @author Martin Neimeier
*/
public class HibernateBundleActivator
extends HibernatePersistenceProvider
implements BundleActivator, /*ServiceListener,*/ BundleListener {
private BundleContext context;
private OsgiClassLoader osgiClassLoader;
@Override
public void start(BundleContext context) throws Exception {
this.context = context;
// register this instance as a bundle listener to get informed about all
// bundle live cycle events
context.addBundleListener(this);
@ -70,13 +62,14 @@ public class HibernateBundleActivator
handleBundleChange( bundle );
}
HibernatePersistenceProvider hpp = new HibernatePersistenceProvider();
Map map = new HashMap();
map.put( AvailableSettings.JTA_PLATFORM, new OsgiJtaPlatform( context ) );
hpp.setEnvironmentProperties( map );
Properties properties = new Properties();
properties.put( "javax.persistence.provider", HibernateBundleActivator.class.getName() );
context.registerService(
PersistenceProvider.class.getName(),
this,
properties
);
properties.put( "javax.persistence.provider", HibernatePersistenceProvider.class.getName() );
context.registerService( PersistenceProvider.class.getName(), hpp, properties );
}
@Override
@ -100,13 +93,4 @@ public class HibernateBundleActivator
osgiClassLoader.unregisterBundle(bundle);
}
}
@Override
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) {
if ( info.getTransactionType().equals( PersistenceUnitTransactionType.JTA ) ) {
map.put( AvailableSettings.JTA_PLATFORM, new OsgiJtaPlatform( context ) );
}
return Bootstrap.getEntityManagerFactoryBuilder( info, map, osgiClassLoader ).build();
}
}