TopLink源代码分析 JPA中的Session实现

TopLink源代码分析 JPA中的Session实现

[什么是JPA]

Java Persistence API
  JPAJDK 5.0注解或XML描述象-系表的映射系,并将运行期的象持久化到数据中。

  Sun引入新的JPA ORM范出于两个原因:其一,Java EEJava SE用的象持久化的开发工作;其二,Sun希望整合ORM实现天下一。

  JPAEJB 3.0组开发,作JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web用、甚至桌面用中使用。JPA的宗旨是POJO提供持久化,由此可经过这几年的践探索,能脱离容器独立运行,方便开发测试的理念已深入人心了。目前Hibernate 3.2TopLink 10.1.3以及OpenJPA都提供了JPA实现

  JPA体思想和HibernateTopLinkJDOORM框架大体一致。的来JPA包括以下3方面的技

  ORM映射元数据,JPA支持XMLJDK 5.0注解两元数据的形式,元数据描述象和表之的映射系,框架据此将象持久化到数据表中;

  JPA API,用来操作象,CRUD操作,框架在后台替我完成所有的事情,开发者从繁JDBCSQL中解脱出来。

  查询语言,是持久化操作中很重要的一个方面,通面向象而非面向数据查询语查询数据,避免程序的SQL密耦合

 

[TopLinke中的JPA源代码---数据session的实现]

 

 

 通过JPA访问数据库的代码

sessionManager manager = new sessionManager.getMananger();
    DatabaseSession session = (DatabaseSession)manager.getSession(“sessionName”, test.getClass().getClassLoader());

 

 

 

 

 

 

 

 

 

接上面的getSession函数

public synchronized AbstractSession getSession(String sessionName, ClassLoader objectClassLoader, boolean shouldLoginSession, boolean shouldRefreshSession, boolean shouldCheckClassLoader) {

        AbstractSession session = (AbstractSession)getSessions().get(sessionName);

        if (shouldCheckClassLoader && (session != null) && !session.getDatasourcePlatform().getConversionManager().getLoader().equals(objectClassLoader)) {

            //bug 3766808  if a different classloader is being used then a reload of the session should

            //be completed otherwise failures may occur

            shouldRefreshSession = true;

        }

        if ((session == null) || shouldRefreshSession) {

            if (session != null) {

                if (session.isDatabaseSession() && session.isConnected()) {

                    ((DatabaseSession)session).logout();

                }

 

                getSessions().remove(sessionName);

            }

        }

   if (session == null) {

            logAndThrowException(SessionLog.WARNING, ValidationException.noSessionFound(sessionName, ""));

        } else if (shouldLoginSession && !session.isConnected()) {

            ((DatabaseSession)session).login();

        }

 

        return session;

    }

 

以上程序中 session.login()中对应的真实处理函数

/**

     * PUBLIC:

     * Connect to the database using the predefined login.

     * The login must have been assigned when or after creating the session.

     *

     * @see #login(Login)

     */

    public void login() throws DatabaseException {

        preConnectDatasource();

        connect();

        postConnectDatasource();

    }

 

 

 

 

以上第一个调用函数

     preConnectDatasource() 主要做数据库连接前的处理 代码如下

/**

     * INTERNAL:

     * This method includes all of the code that is issued before the datasource

     * is connected to.

     */

    protected void preConnectDatasource(){

        //Bug#3440544 Check if logged in already to stop the attempt to login more than once

        if (isLoggedIn) {

            throw ValidationException.alreadyLoggedIn(this.getName());

        }

        this.platform = null;

        if (isInProfile()) {

            getProfiler().initialize();

        }

        updateProfile(SessionProfiler.LoginTime, new Date(System.currentTimeMillis()));

 

        // Login and initialize

        getEventManager().preLogin(this);

        //setup the external transaction controller

        getServerPlatform().initializeExternalTransactionController();

        log(SessionLog.INFO, null, "topLink_version", DatasourceLogin.getVersion());

        if (getServerPlatform().getServerNameAndVersion() != null) {

            log(SessionLog.FINE, null, "application_server_name_and_version", getServerPlatform().getServerNameAndVersion());

        }

    }

 

以上第一个调用函数

     connect(); 正式连接数据库 代码如下

/**

     * Connect to the database.

     * Exceptions are caught and re-thrown as TopLink exceptions.

     */

    protected void connect(Login login) throws DatabaseException {

        setDatasourceConnection(login.connectToDatasource(this));

        setIsConnected(true);

    }

 

 

 

 [总结]

     以上主要分析了TOPLINK中关于JPA连接数据库session的源代码分析

你可能感兴趣的:(TopLink源代码分析 JPA中的Session实现)