Как сохранить один и тот же объект JPA в нескольких базах данных (распределенная система)?
(Как) возможно ли сохранить сущность JPA в базах данных нескольких серверов, не копируя все в DTO?
У нас есть распределенная система. Некоторые приложения имеют БД для кеширования. Поставщик JPA создает исключение, в котором он жалуется, что не может сохранить отсоединенный объект.
Но я хотел бы сохранить идентификатор объекта, просто сохранив его в этой дополнительной БД.
(JPA 1.2, EJB 3.0, Glassfish v2.1, Toplink Essentials)
1 ответ
Не em.persist(obj), просто em.merge(obj). Слияние работает как с прикрепленными, так и с отсоединенными объектами.
Если вы начинаете с отсоединенного объекта, я бы слил объект с соответствующими EntityManager. Если вы пытаетесь сохранить идентичный ключ на всех объектах, я бы вытащил ключ из первого объединенного объекта и использовал его в будущем.
То, что вы, вероятно, (я не знаю) не хотите делать, это попытаться объединить объект, которым управляет один EM, с другим EM. Вы можете проверить это, чтобы увидеть, работает ли оно, я просто не знаю, что произойдет, если вы попытаетесь.
Так.
YourEntity unattachedEntity = ... // your original entity object.
YourEntity managedEntity = em1.merge(unattachedEntity);
// managedEntity now has the primary key assigned by the DB
unattacheEntity.setPrimaryKey(managedEntity.getPrimaryKey());
em2.merge(unattachedEntity);
em3.merge(unattachedEntity);
Нечто подобное должно работать нормально.