Безопасность в сеансе Hibernate

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

public class Example1 {
    MyDao dao;
    ...
    public void doWork() {
        MyEntity entity = dao.getEntity();
        Runnable job = new Job(entity);
        Thread t = new Thread(job);
        t.run();
        t.join();
        dao.merge(entity);
    }

}

Мой второй вопрос: безопасно ли новое создать объект в одном потоке и сохранить его в другом?

public class Example2 {
    MyDao dao;
    ...
    public void doWork() {
        MyEntity entity = new Entity();
        new Thread(new Job(dao, entity)).run();
    }
}

public class Job implements Runnable {
    private MyDao dao;
    private MyEntity entity;
    ...
    @Override
    public void run() {
        dao.save(entity);
    }
}

Изменить Я забыл упомянуть, что объекты специально настроены для активной загрузки

Ответ 1

  • Нет. Объект прикреплен к сеансу и содержит прокси, связанные с сеансом (для того, чтобы лениво загружать себя). Таким образом, это будет использовать сеанс из нескольких потоков. Поскольку сеанс не является потокобезопасным, это не очень хорошая идея.

  • Пока сущность временно (т.е. вы только что создали ее с новым), она не привязана к сеансу, Hibernate не знает об этом, а сущность - простой старый объект Java. Так что никаких проблем с этим. У меня нет всех деталей вашего DAO. Если метод вашего DAO должен быть вызван как часть существующей транзакции, это не сработает, поскольку транзакция привязана к текущему потоку.