Отсоедините объект от контекста персистентности JPA/EJB3

Я бы предложил следующую «случайную задержку с удержанием»:

  • Поддерживать два массива, один (in-array), первоначально заполненный значениями от 0 до n-1, другой ( out-array) empty
  • Когда запрашивается результат: верните случайное значение из всех значений в in-array, переместите это значение с in-array на out-array, переместите один (по всем элементам, включая неопределенный!) элемент из out-array обратно в in-array

Это свойство обладает тем, что оно будет «реагировать» больше медленно больше n . Например, если вы хотите 20% -ный шанс, установка n на 5 и нажатие на 0 является «менее случайным», чем установка n до 10 и нажатие на 0 или 1, и от 0 до 199 из 1000 будет почти неотличим от истинной случайности над небольшим образцом. Вам нужно будет отрегулировать n на ваш размер выборки.

54
задан Pascal Thivent 1 September 2010 в 10:42
поделиться

7 ответов

К сожалению, нет никакого способа разъединить один объект от менеджера по объекту в текущей реализации JPA, AFAIR.

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

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

18
ответ дан Andrei 7 November 2019 в 07:48
поделиться

Насколько я знаю, единственные прямые способы сделать это:

  1. Фиксация txn - Вероятно, не разумная опция
  2. Очищает Контекст Персистентности - EntityManager.clear () - Это является жестоким, но очистило бы его
  3. Копия объект - Большую часть времени, Ваши объекты JPA являются сериализуемыми, таким образом, это должно быть легко (если не особенно эффективный).
3
ответ дан jsight 7 November 2019 в 07:48
поделиться

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

Это могло быть реализовано как конструктор копии, например:

public Thing(Thing oldBean) {
  this.setPropertyOne(oldBean.getPropertyOne());
  // and so on
}

Тогда:

Thing newBean = new Thing(oldBean);
1
ответ дан tonygambone 7 November 2019 в 07:48
поделиться

(может быть, слишком поздно отвечать, но может быть полезно для других)

Я разрабатываю свою первую систему с JPA прямо сейчас. К сожалению, я столкнулся с этой проблемой, когда эта система почти завершена.

Проще говоря. Используйте Hibernate или дождитесь JPA 2.0.

В Hibernate вы можете использовать 'session.evict (object)' для удаления одного объекта из сеанса. В JPA 2.0, сейчас в черновике , есть метод EntityManager.detach (object) для отделения одного объекта от контекста постоянства.

58
ответ дан 7 November 2019 в 07:48
поделиться

это быстро и грязно, но вы также можете сериализовать и десериализовать объект.

1
ответ дан 7 November 2019 в 07:48
поделиться

Я думаю, вы также можете использовать метод EntityManager.refresh (Object o), если первичный ключ объекта не был изменен. Этот метод восстановит исходное состояние объекта.

-1
ответ дан 7 November 2019 в 07:48
поделиться

Если вам нужно отсоединить объект от EntiteManager, и вы используете Hibernate в качестве основного слоя ORM, вы можете получить доступ к объекту Session и использовать Session.evict (объект) Метод, который упоминается выше. Mauricio Kanada.

public void detach(Object entity) {
    org.hibernate.Session session = (Session) entityManager.getDelegate();
    session.evict(entity);
}

Конечно, это сломалось бы, если вы переключитесь на другой поставщик ORM, но я думаю, что это предпочтительно, чтобы попытаться сделать глубокую копию.

19
ответ дан 7 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: