4.1 트랜잭션 및 데이터베이스 무결성

데이터베이스의 정상 작동 모드는 수백 개의 서로 다른 클라이언트로부터 분당 수천 건의 요청을 받는 것입니다. 이 경우 서로 다른 쿼리에서 동일한 데이터에 액세스하는 상황이 자주 발생합니다.

자주는 아니지만 때때로 한 요청이 특정 줄을 읽고 다른 요청이 동시에 변경하는 상황이 있습니다. 누군가가 절반만 변경된 줄을 읽는다면 어떤 일이 일어날지 상상해 보십시오. 좋은 건 없어.

이 문제는 여러 가지 방법으로 해결됩니다. 첫째, 변경되는 줄을 잠글 수 있습니다. 읽기용과 쓰기용 모두. 이 방법은 효과가 있지만 기본 속도가 크게 저하됩니다.

두 번째 방법은 문자열을 쓰기 전용으로 잠그는 것입니다. 그러나 누군가가 부분적으로 수정된 줄을 읽으려고 하면 여전히 문제가 있습니다. 결론 - 라인이 부분적으로 변경되는 상황은 없어야 한다.

따라서 그들은 거래라는 세 번째 방법을 생각해 냈습니다. 트랜잭션은 모두 함께 수행되거나 전혀 수행되지 않는 작업 그룹입니다. 작업의 일부가 수행되고 두 번째 부분이 수행되지 않는 상황은 있을 수 없습니다. 모든 변경을 수행할 수 없는 경우 이미 수행된 모든 변경이 롤백됩니다.

최신 SQL 서버에서는 트랜잭션에서만 데이터를 변경할 수 있습니다. 트랜잭션을 열고 원하는 수의 테이블을 변경하고 트랜잭션을 커밋합니다. 그런 다음 SQL Server는 변경을 시도합니다. 모든 것이 정상이면 일반 데이터베이스에 추가됩니다. 문제가 있으면 모든 변경 사항이 취소됩니다.

Hibernate도 이 패러다임을 사용합니다. 그래서 이전 강의에서 Employee 객체를 데이터베이스에 저장하려고 할 때 트랜잭션이 먼저 열리고 저장 후 커밋되는 것을 보았습니다.

이 항목에 대해 자세히 살펴보겠지만 지금은 트랜잭션이 필요한 이유와 트랜잭션이 일반적으로 사용되는 위치만 알아두십시오.

4.2 객체 가져오기

Hibernate가 데이터를 얻기 위해 요청을 실행하면 명시적으로 트랜잭션을 열 필요가 없습니다. Hibernate 자체는 적합하다고 판단되면 이 작업을 수행합니다. Hibernate는 SQL 서버의 설정뿐만 아니라 자체 설정도 가지고 있습니다.

데이터베이스 작업 방법을 분석합니다. 그리고 그들 중 가장 간단한 것은 ID 로 객체를 얻는 것입니다 . 이렇게 하려면 세션get() 개체 에서 메서드를 사용합니다 . 이러한 요청의 일반적인 형식은 다음과 같습니다.

Class Name = session.get(Class.class, ID);

예:

public User getUserById(Integer id) {
    try (Session session = sessionFactory.openSession()) {
        User user = session.get(User.class, id);
        return user;
    }
}

4.3 개체 저장(추가)

개체를 데이터베이스에 저장하려는 경우 SQL 수준에서 쿼리가 실행됩니다.끼워 넣다. 따라서 귀하의 작업은 별도의 트랜잭션으로 수행되어야 합니다. 또한 세션persist() 개체의 지속성 메서드를 사용하는 것이 좋습니다 .

이러한 요청의 일반적인 형식은 다음과 같습니다.

session.persist(An object);

이 방법은 persist()기반뿐만 아니라 개체 자체도 변경합니다. 문제는 데이터베이스에 개체를 추가할 때 이 개체를 추가하기 전에는 아직 자체 ID가 없다는 것입니다 . 뉘앙스가 있지만 일반적으로 그렇습니다. 그리고 개체를 추가한 후에는 이미 ID가 있습니다.

public boolean saveUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

Session 개체에도 save()유사한 기능을 수행하는 메서드가 있습니다 . save()방법이 이전 Hibernate 표준이고 방법이 persist()JPA 표준이라는 것입니다 .

4.4 개체 삭제

기존 개체를 삭제하려는 경우 매우 쉽게 삭제할 수 있습니다. 이를 위해 세션 개체에는 특별한 메서드가 있습니다 remove().

이러한 요청의 일반적인 형식은 다음과 같습니다.

session.remove(An object);

물론, 예제와 함께 코드를 작성해 봅시다.

public boolean removeUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.remove(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

왜 그렇게 어려운가요?

우선, 데이터베이스에 대한 모든 변경 사항은 항상 다르며 항상 분명한 결과는 아닙니다. 두 번째로, 이 개체에는 연결된 자식 개체 등이 있을 수 있습니다. 따라서 삭제 시나리오는 종종 사소하지 않습니다.