Невозможно получить сессию с помощью SessionFactory.getCurrentSession () в Hibernate5 с Spring - PullRequest
0 голосов
/ 13 января 2019

Я совершенно новичок в Spring и Hibernate. У меня возникают трудности с взаимодействием Spring и Hibernate, поэтому моя конфигурация Spring возвращает объект Session из объекта SessionFactory.

В частности, я следовал руководству по адресу: https://www.baeldung.com/hibernate-5-spring. Это руководство предназначено для настройки Spring и Hibernate для базы данных H2. Однако в настоящее время я настраиваю Spring и Hibernate для Oracle 12.2. Я отразил изменения в файлах конфигурации.

Как и на вышеупомянутом сайте, я написал проект Maven со всеми необходимыми зависимостями. Кроме того, я настраиваю Hibernate 5 с помощью конфигурации на основе XML.

Пожалуйста, найдите код ниже:

Вот файл конфигурации Spring - Hibernate:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.test">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="debug">true</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
    <property name="username" value="sa"/>
    <property name="password" value="sa"/>
</bean>

<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

Вот код Java, который я использую, чтобы попытаться защитить объект Hibernate Session:

@Autowired
private SessionFactory sessionFactory;
public Session getSession()
{
    Session session = null;
    try
    {
        session = sessionFactory.getCurrentSession();
        if(session != null)
        {
            System.out.println("Session is VALID.");
        }
        else
        {
            System.out.println("Session is INVALID.");
        }
    }
    catch(IllegalStateException e)
    {
        System.out.println("getSession: Illegal State Exception: " + e.getMessage());
    }
    catch(Exception e)
    {
        System.out.println("getSession: Exception: " + e.getMessage());
    }
    return session;
}

Вот проект pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> 

<groupId>com.test</groupId>
<artifactId>Flow</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Flow</name>
<url>http://www.example.com</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.springframework.version>5.0.2.RELEASE</org.springframework.version>
    <org.springframework.data.version>1.10.6.RELEASE</org.springframework.data.version>
    <org.springframework.security.version>4.2.1.RELEASE</org.springframework.security.version>
    <hibernate.version>5.2.10.Final</hibernate.version>
    <hibernatesearch.version>5.8.2.Final</hibernatesearch.version>
    <tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
    <jta.version>1.1</jta.version>
    <hsqldb.version>2.3.4</hsqldb.version>
    <oracle.version>12.2.0.1</oracle.version>
    <commons-lang3.version>3.5</commons-lang3.version>
</properties>

<repositories>
  <repository>
    <id>maven.oracle.com</id>
    <releases>
      <enabled>true</enabled>
    </releases>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <url>https://maven.oracle.com</url>
    <layout>default</layout>
  </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>maven.oracle.com</id>
        <url>https://maven.oracle.com</url>
    </pluginRepository>
</pluginRepositories>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework.version}</version>
        <exclusions>
            <exclusion>
                <artifactId>commons-logging</artifactId>
                <groupId>commons-logging</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>

    <!-- persistence -->

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>${org.springframework.data.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>${jta.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-dbcp</artifactId>
        <version>${tomcat-dbcp.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>${oracle.version}</version>
    </dependency>   
</dependencies>

<build>
    <finalName>Flows</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
        <plugins>
            <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
            <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.2</version>
            </plugin>
            <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
            <plugin>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.7.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

То, что я ожидаю получить, является объектом Session; однако, когда я запускаю свой код, переменная session i возвращает ноль. Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 13 января 2019

Свойство hibernate hibernate.current_session_context_class определяет, как SessionFactory извлекает текущий Session. При использовании LocalSessionFactoryBean для сборки SessionFactory по умолчанию он устанавливается на SpringSessionContext, что в основном означает, что Spring будет управлять сессией за вас.

Так что в большинстве случаев вам не нужно получать сеанс, вызывая sessionFactory.getCurrentSession(). Просто используйте @PersistenceContext, чтобы ввести и использовать Session:

@PersistenceContext
private Session session;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...