Hibernate - Сохранение сущностей - Таблица обновления - Не основано на первичном ключе - PullRequest
3 голосов
/ 15 июля 2010

Псевдокод, чтобы добраться до точки:

@Entity
Person {
   @Id
   Integer id;
   String SSN;
   String name;
}

Вариант использования для хранилища или службы:

personRepository.save(new Person(ssn:"123456", name:"jeff")):
  • id - уникальный первичный ключ с автоинкрементом
  • SSN является уникальным и является идентификатором человека.
  • имя является просто строкой и может быть изменено

В настоящее время сохранение использует hibernate merge() для вставки / обновления, но у меня нет id при сохранении (часть моего уровня абстракции, так что клиентскому коду вообще не нужно касаться сущностей), так как я могу обновить имя человека, если SSN ужеприсутствовать в базе данных без необходимости отдельного поиска в этом поле, а затем использовать там логику ветвления (я не хочу этого делать, потому что я могу обновлять и вставлять МНОГИЕ люди сразу и думаю, что это будет медленно)

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Вы можете использовать свой сеанс для генерации HQL-запроса и прокручивать свое собственное обновление следующим образом:

String queryString = "update Person set name = :name where ssn = :ssn";
Query query = session.createQuery(queryString);
query.setString("name", newName);
query.setString("ssn", ssn);
query.executeUpdate();

Я не знаю, как можно обновить сущность, как вы предлагаете, поскольку Hibernate очень сильно зависит от вашего поля @Id для определения постоянного состояния.

1 голос
/ 15 июля 2010

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

Единственный вариант, который я могу себе представить, - это использовать SSN в качестве первичного ключа.

...