← Назад к вопросам

Какой объект отвечает за подключение в Hibernate?

2.0 Middle🔥 231 комментариев
#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Объекты, отвечающие за подключение в Hibernate

В Hibernate существует несколько объектов, отвечающих за управление подключением к базе данных. Вопрос требует точного понимания архитектуры Hibernate и то, какой именно объект выполняет какую роль.

SessionFactory — главный координатор

SessionFactory — это главный объект, который отвечает за создание подключений и управление сессиями. Это фабрика (factory pattern), которая создаёт объекты Session:

// Конфигурация Hibernate
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");

// SessionFactory создаётся один раз при старте приложения
SessionFactory sessionFactory = configuration.buildSessionFactory();

// SessionFactory — тяжелый объект, который использует DataSource
// для работы с БД

Session — управление подключением

Session — это объект, который отвечает за единичное подключение к БД в контексте одной транзакции или операции:

// Из SessionFactory берём Session
Session session = sessionFactory.openSession();

try {
    // Session управляет подключением
    session.beginTransaction();
    
    // Всё выполняется через эту Session
    User user = session.find(User.class, 1L);
    user.setEmail("new@email.com");
    
    session.getTransaction().commit();
} catch (Exception e) {
    session.getTransaction().rollback();
} finally {
    session.close();  // Закрываем подключение
}

Connection — непосредственно подключение к БД

Connection (java.sql.Connection) — это объект из JDBC, который отвечает за реальное физическое подключение к БД:

// Connection используется внутри Hibernate
// Но в коде мы редко обращаемся к нему напрямую

Session session = sessionFactory.openSession();

// Получить Connection из Session (редко, но возможно)
Connection connection = session.doReturningWork(new ReturningWork<Connection>() {
    @Override
    public Connection execute(Connection conn) {
        // conn — это java.sql.Connection
        // Здесь можно выполнить native SQL
        return conn;
    }
});

DataSource — пул подключений

DataSource — это объект, который управляет пулом подключений (connection pool). Это самый нижний уровень, который работает с БД:

// Конфигурация DataSource
@Configuration
public class DataSourceConfig {
    
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");
        config.setUsername("user");
        config.setPassword("password");
        config.setMaximumPoolSize(10);  // Максимум 10 подключений в пуле
        
        return new HikariDataSource(config);
    }
}

// DataSource используется Hibernate для получения Connection
// когда нужно подключение к БД

Иерархия объектов

Domain Model (entities)
    ↓
  Session (управляет подключением и транзакцией для одного запроса)
    ↓
SessionFactory (создаёт Session'ы и управляет кешем)
    ↓
Connection (JDBC подключение из DataSource пула)
    ↓
DataSource (пул физических подключений)
    ↓
Database (реальная БД)

Практический пример в Spring

В Spring Data JPA и Spring ORM всё управляется автоматически:

@Configuration
@EnableTransactionManagement
public class HibernateConfig {
    
    @Bean
    public DataSource dataSource() {
        // DataSource — управляет пулом подключений
        return new HikariDataSource(createHikariConfig());
    }
    
    @Bean
    public SessionFactory sessionFactory(DataSource dataSource) {
        // SessionFactory — создаёт Session'ы и использует DataSource
        LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setPackagesToScan("com.example.entity");
        factory.setHibernateProperties(hibernateProperties());
        return factory.getObject();
    }
    
    @Bean
    public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
        return new HibernateTransactionManager(sessionFactory);
    }
}

// В сервисе используем Repository
@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;  // Spring Data работает с Session автоматически
    
    @Transactional  // Spring управляет Session'ом
    public User createUser(String email) {
        User user = new User();
        user.setEmail(email);
        return userRepository.save(user);  // Hibernate автоматически берёт Connection из DataSource
    }
}

Кто отвечает за что

ОбъектОтветственность
DataSourceПул физических JDBC подключений (Connection'ов)
ConnectionЕдиничное JDBC подключение к БД
SessionFactoryСоздание Session'ов, управление кешем Hibernate
SessionУправление транзакцией и операциями в контексте одного запроса
TransactionУправление ACID свойствами в рамках Session'а

Когда Session берёт Connection

Session session = sessionFactory.openSession();

// Connection ещё не берётся из пула!
UserRepository repo = session.getRepository(User.class);

// Connection берётся только при первой операции с БД
User user = session.find(User.class, 1L);  // ← вот здесь Connection берётся из DataSource пула

// После закрытия Session подключение возвращается в пул
session.close();  // Connection возвращается в DataSource пул для переиспользования

Ответ на вопрос

Если вопрос о том, кто отвечает за подключение:

  • SessionFactory — отвечает за фабрику создания Session'ов и использует DataSource
  • Session — отвечает за управление подключением в контексте одного запроса
  • DataSource — отвечает за пул физических подключений (Connection'ов)
  • Connection — это само подключение к БД

В большинстве случаев, когда говорят "объект, отвечающий за подключение в Hibernate", имеют в виду Session как объект-посредник между приложением и базой данных через DataSource.