Глубокое копирование EJB Entity bean с отношениями - PullRequest
1 голос
/ 29 сентября 2010

То, что у меня есть, это объектный компонент, например Entity (EJB 3), который сохраняет потомков того же типа в ArrayList<Entity>, его родителя <Entity> и отношение к другому объекту <Users>. Пользователи могут иметь много сущностей и наоборот (от многих ко многим).

Я хотел бы переопределить Entity.clone() (или использовать новый метод) для глубокого копирования Entity вместе с клонами children, принадлежащими тому же родителю и назначенными уже существующим пользователям.

Я настроил метод clone, чтобы создать клон Entity (нового существа), а затем заполнить его клонами children сущностей в цикле foreach.

Но это дает мне одновременное исключение модификации, и я получаю только клон исходного бина Entity без children.

Мой вопрос:

Реально ли то, что я хочу сделать, или мне нужно управлять глубоким копированием, например фасад? Если это возможно, не могли бы вы указать мне что-нибудь почитать или дать пару советов, потому что до сих пор я выполняю клонирование через фасад, и это стало основным бременем в моем приложении.

Заранее спасибо !!

pataroulis

Ответы [ 3 ]

2 голосов
/ 29 сентября 2010

Попробуйте использовать (из commons-lang )

YourEntity clone = SerializationUtils.clone(entity);

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

1 голос
/ 30 сентября 2010

Вы должны создать новый список, в противном случае вы добавляете в тот же список, который вы перебираете, отсюда исключение одновременной модификации.

т.е.

Entity clone = super.clone();
clone.setChildren(new ArrayList());
for (Child child : this.getChildren()) {
  clone.addChild(child.clone());
}
return clone;

Если вы используетеEclipseLink вы также можете использовать API copy () в EclipseLink JpaEntityManager.Вы можете передать CopyGroup, которая указывает, насколько глубоко сделать копию и нужно ли сбросить Id.

0 голосов
/ 23 февраля 2012

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

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