/* * Copyright (c) 2008, 2009, 2011 Oracle, Inc. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. The Eclipse Public License is available * at http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution License * is available at http://www.eclipse.org/org/documents/edl-v10.php. */ package com.fr.third.javax.persistence; import com.fr.third.javax.persistence.spi.LoadState; import com.fr.third.javax.persistence.spi.PersistenceProvider; import com.fr.third.javax.persistence.spi.PersistenceProviderResolverHolder; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Bootstrap class that provides access to an EntityManagerFactory. */ public class Persistence { @Deprecated public static final String PERSISTENCE_PROVIDER = "com.fr.third.javax.persistence.spi.PeristenceProvider"; @Deprecated protected static final Set providers = new HashSet(); /** * Create and return an EntityManagerFactory for the named persistence unit. * * @param persistenceUnitName The name of the persistence unit * * @return The factory that creates EntityManagers configured according to the specified persistence unit */ public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) { return createEntityManagerFactory( persistenceUnitName, null ); } /** * Create and return an EntityManagerFactory for the named persistence unit using the given properties. * * @param persistenceUnitName The name of the persistence unit * @param properties Additional properties to use when creating the factory. The values of these properties override * any values that may have been configured elsewhere * * @return The factory that creates EntityManagers configured according to the specified persistence unit */ public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) { EntityManagerFactory emf = null; List providers = getProviders(); for ( PersistenceProvider provider : providers ) { emf = provider.createEntityManagerFactory( persistenceUnitName, properties ); if ( emf != null ) { break; } } if ( emf == null ) { throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName ); } return emf; } private static List getProviders() { return PersistenceProviderResolverHolder .getPersistenceProviderResolver() .getPersistenceProviders(); } /** * Create database schemas and/or tables and/or create DDL scripts as determined by the supplied properties * * Called when schema generation is to occur as a separate phase from creation of the entity manager factory. * * @param persistenceUnitName the name of the persistence unit * @param properties properties for schema generation; these may also contain provider-specific properties. The * values of these properties override any values that may have been configured elsewhere. * * @throws PersistenceException if insufficient or inconsistent configuration information is provided or if schema * generation otherwise fails. */ public static void generateSchema(String persistenceUnitName, Map properties) { List providers = getProviders(); for ( PersistenceProvider provider : providers ) { final boolean generated = provider.generateSchema( persistenceUnitName, properties ); if ( generated ) { return; } } throw new PersistenceException( "No persistence provider found for schema generation for persistence-unit named " + persistenceUnitName ); } /** * @return Returns a PersistenceUtil instance. */ public static PersistenceUtil getPersistenceUtil() { return util; } private static PersistenceUtil util = //TODO add an Hibernate specific optimization new PersistenceUtil() { public boolean isLoaded(Object entity, String attributeName) { List providers = Persistence.getProviders(); for ( PersistenceProvider provider : providers ) { final LoadState state = provider.getProviderUtil().isLoadedWithoutReference( entity, attributeName ); if ( state == LoadState.UNKNOWN ) continue; return state == LoadState.LOADED; } for ( PersistenceProvider provider : providers ) { final LoadState state = provider.getProviderUtil().isLoadedWithReference( entity, attributeName ); if ( state == LoadState.UNKNOWN ) continue; return state == LoadState.LOADED; } return true; } public boolean isLoaded(Object object) { List providers = Persistence.getProviders(); for ( PersistenceProvider provider : providers ) { final LoadState state = provider.getProviderUtil().isLoaded( object ); if ( state == LoadState.UNKNOWN ) continue; return state == LoadState.LOADED; } return true; } }; }