1.EntityManagerFactory介绍
在Spring Data中,SessionFactory是用于创建和管理Hibernate的Session的核心组件之一。然而,从Spring Data JPA(Java Persistence API)版本2.0开始,推荐使用JPA的标准EntityManagerFactory来代替Hibernate的SessionFactory,以便更好地与JPA整合。
常用的几个方法:
createEntityManager();方法用于创建一个新的EntityManager对象。EntityManager是用于执行实体类的CRUD操作以及其他数据库查询操作的核心类。
这个方法主要做了两步操作,EntityManagerFactory是否已关闭。如果EntityManagerFactory已经关闭,则不应再创建新的EntityManager。
第二个就是根据根据给定的SynchronizationType和属性Map构建一个新的EntityManager实例。SynchronizationType.SYNCHRONIZED
表示EntityManager将在同步事务中运行,其他的类型还有SYNCHRONIZATION_ALWAYS
和SYNCHRONIZATION_NEVER
,分别表示在同步事务中总是运行和从不运行。
该方法返回的是一个Session
对象,而不是通常用于JPA的EntityManager
对象。这可能是因为你在使用一些非标准的JPA实现,比如Hibernate,或者这段代码来自一个整合了Hibernate的环境中。
总之,该方法是用于创建一个新的Session
(或EntityManager
)对象,并在创建前验证EntityManagerFactory是否处于打开状态。然后根据传入的SynchronizationType和属性Map构建EntityManager。
参考代码:
@Override
public Session createEntityManager() {
validateNotClosed();
return buildEntityManager( SynchronizationType.SYNCHRONIZED, null );
}
private <K,V> Session buildEntityManager(final SynchronizationType synchronizationType, final Map<K,V> map) {
assert status != Status.CLOSED;
SessionBuilderImplementor builder = withOptions();
if ( synchronizationType == SynchronizationType.SYNCHRONIZED ) {
builder.autoJoinTransactions( true );
}
else {
builder.autoJoinTransactions( false );
}
final Session session = builder.openSession();
if ( map != null ) {
for ( Map.Entry<K, V> o : map.entrySet() ) {
final K key = o.getKey();
if ( key instanceof String ) {
final String sKey = (String) key;
session.setProperty( sKey, o.getValue() );
}
}
}
return session;
}
isOpen(): 该方法用于检查EntityManagerFactory是否处于打开状态。
close(): 该方法用于关闭EntityManagerFactory。在应用程序关闭时,应该关闭EntityManagerFactory来释放资源。
@Override
public void close() throws HibernateException {
synchronized (this) {
//验证sessionFactory的状态是否为Open,如果不是,切jpa的关闭合规性已启用,则抛出异常,否则,直接返回
if (status != Status.OPEN) {
if (getSessionFactoryOptions().getJpaCompliance().isJpaClosedComplianceEnabled()) {
throw new IllegalStateException("EntityManagerFactory is already closed");
}
LOG.trace("Already closed");
return;
}
//将sessionFacoty的状态标记为closeing
status = Status.CLOSING;
}
try {
LOG.closing();
observer.sessionFactoryClosing(this);
// 释放multi-table bulk id策略
settings.getMultiTableBulkIdStrategy().release(
serviceRegistry.getService(JdbcServices.class),
buildLocalConnectionAccess()
);
// 关闭缓存访问
if (cacheAccess != null) {
cacheAccess.close();
}
// 关闭元模型
if (metamodel != null) {
metamodel.close();
}
// 清理查询计划缓存
if (queryPlanCache != null) {
queryPlanCache.cleanup();
}
// 执行延迟删除动作
if (delayedDropAction != null) {
delayedDropAction.perform(serviceRegistry);
}
// 从SessionFactoryRegistry中移除SessionFactory
SessionFactoryRegistry.INSTANCE.removeSessionFactory(
getUuid(),
name,
settings.isSessionFactoryNameAlsoJndiName(),
serviceRegistry.getService(JndiService.class)
);
} finally {
status = Status.CLOSED;
}
// 通知观察者SessionFactory已关闭
observer.sessionFactoryClosed(this);
// 销毁ServiceRegistry
serviceRegistry.destroy();
}