2010-09-29 5 views
1

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

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

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

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

Мой вопрос:

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

Спасибо заранее!

pataroulis

ответ

2

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

YourEntity clone = SerializationUtils.clone(entity); 

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

1

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

т.е.

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

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

0

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

Смежные вопросы