Вставка сгенерированного значения в запись Hibernate - PullRequest
1 голос
/ 24 августа 2009

Я создаю запись виджетов с Hibernate. Это довольно просто. У меня есть файл hbm.xml, описывающий объект, класс DAO, который создает и сохраняет их и т. Д.

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

Hibernate вполне способен автоматически устанавливать столбцы идентификаторов, и для меня имеет смысл установить уникальное значение для некоторых других столбцов в соответствии с формулой, такой как max (sortIndex) +1, или в соответствии с некоторой возрастающей последовательностью значение генератора, но я не могу найти ссылку в документации на такого рода вещи. Может ли кто-нибудь указать мне правильное направление?

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

1 Ответ

1 голос
/ 24 августа 2009

Мне неприятно это говорить, но я думаю, что вам лучше всего делать это программно. Просто что-то в строках:

public void saveNewWidget(Widget widget) {
    Session session = ...;
    int sortIndex = ((Integer) session.createQuery("select max(w.sortIndex) from Widget w").uniqueResult()) + 1;
    widget.setSortIndex(sortIndex);
    session.save(widget);
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...