Как можно копировать saveOrUpdate Hibernate в JPA?

Хорошо, так как мы взвешиваемся с мнением:

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

Для тех, кому нравится видеть исключительные "имена объекта" в запросах, это - то, для чего я использовал бы псевдонимы таблицы:

SELECT person.Name
FROM People person

Немного как LINQ's "от человека у людей выбирают человека. Имя".

Что касается 2, 3 и 4, я соглашаюсь с @Lars.

38
задан James McMahon 16 July 2009 в 18:41
поделиться

2 ответа

Попробуйте использовать метод EntityManager.merge - это очень похож.

Отличное описание различий содержится в блоге Xebia: « Шаблоны реализации JPA: сохранение (отдельных) объектов ».

29
ответ дан 27 November 2019 в 03:54
поделиться

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

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

Вот моя текущая работа для этой ситуации:

/**
 * Save an object into the database if it does not exist, else return
 * object that exists in the database.
 *
 * @param query query to find object in the database, should only return
 * one object.
 * @param entity Object to save or update.
 * @return Object in the database, whither it was prior or not.
 */
private Object saveOrUpdate(Query query, Object entity) {
    final int NO_RESULT = 0;
    final int RESULT = 1;

    //should return a list of ONE result, 
    // since the query should be finding unique objects
    List results = query.getResultList();
    switch (results.size()) {
        case NO_RESULT:
            em.persist(entity);
            return entity;
        case RESULT:
            return results.get(0);
        default:
            throw new NonUniqueResultException("Unexpected query results, " +
                    results.size());
    }
}
4
ответ дан 27 November 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: