Я бы предложил следующую «случайную задержку с удержанием»:
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 на ваш размер выборки.
К сожалению, нет никакого способа разъединить один объект от менеджера по объекту в текущей реализации JPA, AFAIR.
EntityManager.clear () разъединится весь объекты JPA, так, чтобы не могло бы быть соответствующее решение во всех случаях, если у Вас есть другие объекты, Вы действительно планируете связаться.
, Таким образом, Ваш лучший выбор состоял бы в том, чтобы клонировать объекты и передать клоны коду, который изменяет объекты. Так как примитивные и неизменные поля объекта заботятся о механизмом клонирования значения по умолчанию надлежащим способом, Вы не должны будете писать большую инфраструктуру кода (кроме глубокого клонирования любых агрегированных структур, которые Вы могли бы иметь).
Насколько я знаю, единственные прямые способы сделать это:
Если нет слишком многих свойств в бобе, Вы могли бы просто создать новый экземпляр и установить все его свойства вручную от сохраненного боба.
Это могло быть реализовано как конструктор копии, например:
public Thing(Thing oldBean) {
this.setPropertyOne(oldBean.getPropertyOne());
// and so on
}
Тогда:
Thing newBean = new Thing(oldBean);
(может быть, слишком поздно отвечать, но может быть полезно для других)
Я разрабатываю свою первую систему с JPA прямо сейчас. К сожалению, я столкнулся с этой проблемой, когда эта система почти завершена.
Проще говоря. Используйте Hibernate или дождитесь JPA 2.0.
В Hibernate вы можете использовать 'session.evict (object)' для удаления одного объекта из сеанса. В JPA 2.0, сейчас в черновике , есть метод EntityManager.detach (object) для отделения одного объекта от контекста постоянства.
это быстро и грязно, но вы также можете сериализовать и десериализовать объект.
Я думаю, вы также можете использовать метод EntityManager.refresh (Object o), если первичный ключ объекта не был изменен. Этот метод восстановит исходное состояние объекта.
Если вам нужно отсоединить объект от EntiteManager, и вы используете Hibernate в качестве основного слоя ORM, вы можете получить доступ к объекту Session и использовать Session.evict (объект) Метод, который упоминается выше. Mauricio Kanada.
public void detach(Object entity) {
org.hibernate.Session session = (Session) entityManager.getDelegate();
session.evict(entity);
}
Конечно, это сломалось бы, если вы переключитесь на другой поставщик ORM, но я думаю, что это предпочтительно, чтобы попытаться сделать глубокую копию.