Hibernate блокировка массива предметов - PullRequest
3 голосов
/ 19 августа 2011
List <Student> st = session.createQuery ("select ids from students where a = :a")
                        .setString("a", value)
                        .list();

//Errors out saying that ArrayList is an unknown entity
session.lock(st, LockMode.UPGRADE); 

Студенты сами расширяют Serializable.Как вы блокируете список пользователей serailizables в Hibernate?

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Вам необходимо прокрутить список и заблокировать объекты по одному.

for(Student s : st) {
  session.lock(s, LockMode.UPGRADE);
}

ПРИМЕЧАНИЕ: Session # lock (java.lang.Object, org.hibernate.LockMode) устарел в пользу session.buildLockRequest (LockMode.UPGRADE) .lock (student)

UPDATE: Вы также можете заблокировать запрос непосредственно с помощью Query.setLockMode (java).lang.String, org.hibernate.LockMode) .

0 голосов
/ 25 марта 2019

Если вы используете репозиторий JPA, вы можете использовать следующий пример:

import com.example.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import javax.persistence.LockModeType;
import java.util.List;

public interface StudentRepository extends JpaRepository<Student, Long> {

    @Lock(value = LockModeType.PESSIMISTIC_WRITE)
    @Query("select s from Student s where s.id IN (:ids)")
    List<Student> findByIdsAndLockForWrite(@Param("ids") List<Long> ids);

}

Обратите внимание, что служба, которая вызывает этот репозиторий, должна использовать:
@Transactional(propagation = Propagation.REQUIRES_NEW)

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