/*
* Copyright (c) 2008, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Linda DeMichiel - Java Persistence 2.1
// Linda DeMichiel - Java Persistence 2.0
package javax.persistence;
import java.util.
List;
import java.util.
Map;
import java.util.
Set;
import java.util.
HashSet;
import javax.persistence.spi.
PersistenceProvider;
import javax.persistence.spi.
PersistenceProviderResolver;
import javax.persistence.spi.
PersistenceProviderResolverHolder;
import javax.persistence.spi.
LoadState;
/**
* Bootstrap class that is used to obtain an {@link EntityManagerFactory}
* in Java SE environments. It may also be used to cause schema
* generation to occur.
*
* <p> The <code>Persistence</code> class is available in a Java EE
* container environment as well; however, support for the Java SE
* bootstrapping APIs is not required in container environments.
*
* <p> The <code>Persistence</code> class is used to obtain a {@link
* javax.persistence.PersistenceUtil PersistenceUtil} instance in both
* Java EE and Java SE environments.
*
* @since Java Persistence 1.0
*/
public class
Persistence {
/**
* 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.
* These properties may include properties to control
* schema generation. 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;
PersistenceProviderResolver resolver =
PersistenceProviderResolverHolder.
getPersistenceProviderResolver();
List<
PersistenceProvider>
providers =
resolver.
getPersistenceProviders();
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;
}
/**
* Create database schemas and/or tables and/or create DDL
* scripts as determined by the supplied properties.
* <p>
* Called when schema generation is to occur as a separate phase
* from creation of the entity manager factory.
* <p>
* @param persistenceUnitName the name of the persistence unit
* @param map properties for schema generation; these may
* also contain provider-specific properties. The
* value 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.
*
* @since Java Persistence 2.1
*/
public static void
generateSchema(
String persistenceUnitName,
Map map) {
PersistenceProviderResolver resolver =
PersistenceProviderResolverHolder.
getPersistenceProviderResolver();
List<
PersistenceProvider>
providers =
resolver.
getPersistenceProviders();
for (
PersistenceProvider provider :
providers) {
if (
provider.
generateSchema(
persistenceUnitName,
map)) {
return;
}
}
throw new
PersistenceException("No Persistence provider to generate schema named " +
persistenceUnitName);
}
/**
* Return the PersistenceUtil instance
* @return PersistenceUtil instance
* @since Java Persistence 2.0
*/
public static
PersistenceUtil getPersistenceUtil() {
return new
PersistenceUtilImpl();
}
/**
* Implementation of PersistenceUtil interface
* @since Java Persistence 2.0
*/
private static class
PersistenceUtilImpl implements
PersistenceUtil {
public boolean
isLoaded(
Object entity,
String attributeName) {
PersistenceProviderResolver resolver =
PersistenceProviderResolverHolder.
getPersistenceProviderResolver();
List<
PersistenceProvider>
providers =
resolver.
getPersistenceProviders();
for (
PersistenceProvider provider :
providers) {
LoadState loadstate =
provider.
getProviderUtil().
isLoadedWithoutReference(
entity,
attributeName);
if(
loadstate ==
LoadState.
LOADED) {
return true;
} else if (
loadstate ==
LoadState.
NOT_LOADED) {
return false;
} // else continue
}
//None of the providers could determine the load state try isLoadedWithReference
for (
PersistenceProvider provider :
providers) {
LoadState loadstate =
provider.
getProviderUtil().
isLoadedWithReference(
entity,
attributeName);
if(
loadstate ==
LoadState.
LOADED) {
return true;
} else if (
loadstate ==
LoadState.
NOT_LOADED) {
return false;
} // else continue
}
//None of the providers could determine the load state.
return true;
}
public boolean
isLoaded(
Object entity) {
PersistenceProviderResolver resolver =
PersistenceProviderResolverHolder.
getPersistenceProviderResolver();
List<
PersistenceProvider>
providers =
resolver.
getPersistenceProviders();
for (
PersistenceProvider provider :
providers) {
LoadState loadstate =
provider.
getProviderUtil().
isLoaded(
entity);
if(
loadstate ==
LoadState.
LOADED) {
return true;
} else if (
loadstate ==
LoadState.
NOT_LOADED) {
return false;
} // else continue
}
//None of the providers could determine the load state
return true;
}
}
/**
* This final String is deprecated and should be removed and is only here for TCK backward compatibility
* @since Java Persistence 1.0
* @deprecated
*/
@
Deprecated
public static final
String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider";
/**
* This instance variable is deprecated and should be removed and is only here for TCK backward compatibility
* @since Java Persistence 1.0
* @deprecated
*/
@
Deprecated
protected static final
Set<
PersistenceProvider>
providers = new
HashSet<
PersistenceProvider>();
}