Сохранение объекта в Hibernate с известным первичным ключом. - PullRequest
7 голосов
/ 28 июля 2011

Моя проблема с отсоединенными объектами ...

В настоящее время я использую Spring с Hibernate.

У меня есть сопоставленный объект, который имеет первичный ключ в виде строки (я знаю, что это отстой... но рефакторинг кода займет месяцы), и я хочу сохранить его.(Я упростил объект только двумя атрибутами)

@Id
private String id;

private String pattern;

Так, например, я хочу добавить что-то вроде:

["id": "myFirstPattern", "pattern": ". * "]

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

Я провел некоторое исследование и пришел к выводу, что merge () удовлетворит мои потребности, поскольку он сохраняется и обновляется, даже если объект недоступен.Однако я нашел это довольно грязным обходным путем и хотел проверить, есть ли другие решения этой проблемы.

Примите во внимание, что у нас есть слой Helper, поэтому слой Services не будет работать напрямую со слоем HibernateDao.Поэтому я могу «замаскировать» это, добавив методы «persist» и «update», которые будут вызывать один и тот же метод DAO слияния.

Спасибо, Flavio.

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Я попытался использовать другой подход после того, как попробовал идею, которую Маурисио дал мне. Поскольку SaveOrUpdate использовал кэшированные объекты для проверки, должен ли он обновлять или сохранять объект, я подумал о том, чтобы очистить его перед сохранением моего объекта.

Итак, вот мой кусок кода:

try {
        getHibernateTemplate().clear();
        getHibernateTemplate().save(entity);
    } catch (DataAccessException e) {
        if (e.getCause() instanceof ConstraintViolationException)
            throw new HibernateDaoException("Entity could not be persisted. Constraint violation.");
        throw new HibernateDaoException(e);
    }

На данный момент он работает, как и ожидалось, даже если кажется, что он уничтожит причину существования моей кэшированной базы данных ... Однако эта функция обновления будет использоваться экономно, поскольку основной причиной для компонента является возврат информации, сопоставление выкройки и возвращение лучших результатов.

В любом случае, я скоро вернусь, если найду недостатки.

Любые комментарии, пожалуйста, не стесняйтесь их публиковать:)

1 голос
/ 29 июля 2011

Вы пробовали saveOrUpdate?

Session sess = factory.openSession();
Transaction tx;
try {
    tx = sess.beginTransaction();
    session.saveOrUpdate( yourObjectHere );

    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
}
finally {
    sess.close();
}
0 голосов
/ 29 июля 2011

Я не уверен, и я не могу попробовать прямо сейчас, но разве настройка свойства @Id для использования «назначенного» генератора делает именно это?

...