You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
5.1 KiB
134 lines
5.1 KiB
7 years ago
|
/*
|
||
|
* 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<PersistenceProvider> providers = new HashSet<PersistenceProvider>();
|
||
|
|
||
|
/**
|
||
|
* 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<PersistenceProvider> 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<PersistenceProvider> 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<PersistenceProvider> 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 <code>PersistenceUtil</code> 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<PersistenceProvider> 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<PersistenceProvider> 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;
|
||
|
}
|
||
|
};
|
||
|
}
|