Загрузка из одной единицы сопротивления и сохранение в другой - PullRequest
1 голос
/ 10 февраля 2011

У меня проблема с Hibernate / JPA, проблема, когда магия за сценой усложняет жизнь. То, что я хотел бы сделать, очень тривиально, поэтому для этого должно быть решение, но я просто не могу его найти.

Итак, я хотел бы загрузить несколько таблиц из одной единицы персистентности (базы данных) и сохранить их в другой единице персистентности (другой базе данных). Ничего смешного здесь не происходит, просто загружайте и сохраняйте.

В моей первой попытке я использовал persist , чтобы сохранить отдельные объекты в новом модуле персистентности. Это не сработало, поскольку у них уже есть идентификаторы, поэтому мне пришлось попробовать что-то еще.

Итак, моя вторая попытка - использовать merge , но это привело к тому, что Hibernate сделал один (как минимум) select на каждую дополнительную сущность. Использование merge привело к тому, что это было очень медленно и, в конце концов, нам не пригодилось.

Итак, на мой вопрос, есть ли в любом случае сохраняющиеся отдельные сущности в новом подразделении персистентности без использования merge ? Я уже знаю, что таблицы пусты, поэтому мне не нужен спящий режим, чтобы проверить это для меня ...

1 Ответ

1 голос
/ 10 февраля 2011

Это должно работать.

Entity e = em1.load(id);
em1.detach(e);
e.setId(0); // or null
em2.persist(e);

Вы, конечно, должны сделать setId видимым для этого кода.

Если вы пытаетесь реализовать репликацию для всего, возможно, лучше сделать это в реальных базах данных (т. Е. Использовать любые кластерные функции, которые есть в вашей СУБД).

Edit:

Другим вариантом будет реализация (глубокого) конструктора копирования для ваших сущностей.

Entity e1 = em1.load(id);
Entity e2 = new Entity(e1);
em2.persist(e2);
...