Как сохранить одну и ту же сущность JPA в нескольких базах данных (распределенная система)?

(Как) возможно сохранить объект JPA в базах данных нескольких серверов, не копируя все в DTO?

У нас распределенная система. У некоторых приложений есть БД для кэширования. Поставщик JPA выдает исключение, в котором он жалуется, что не может сохранить отсоединенный объект.

Но я хотел бы сохранить идентификатор объекта, просто сохранив его в этой дополнительной БД.

(JPA 1.2, EJB 3.0, Glassfish v2.1, Toplink Essentials)


person SAL9000    schedule 02.06.2009    source источник


Ответы (1)


Не em.persist (obj), просто em.merge (obj). Слияние работает как с присоединенными, так и с отсоединенными объектами.

Если вы начинаете с отдельного объекта, я бы объединил его с соответствующими EntityManager. Если вы пытаетесь сохранить одинаковый ключ идентификации для всех объектов, я бы взял ключ из первого объединенного объекта и использовал его в будущем.

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

So.

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);

Что-то вроде этого должно работать нормально.

person Will Hartung    schedule 02.06.2009
comment
Большое спасибо! Это действительно сработало! Ваш ответ был невероятно полезным! Раньше я пробовал объединить, но не с помощью вашего волшебного трюка с использованием двух сущностей. - person SAL9000; 02.06.2009