Изменение типа объекта, сохраняющего его идентификатор

POEdit не действительно тверд получить подвешивание. Просто создайте новый .po файл, затем скажите ему импортировать строки из исходных файлов. Программа сканирует Ваши файлы PHP для любых вызовов функции, соответствующих _("Text"), gettext("Text") и т.д. Можно даже определить собственные функции для поиска.

Вы тогда вводите перевод в соответствующее поле. Когда Вы сохранили свой .po файл, .mo файл автоматически сгенерирован. Это - просто версия двоичных файлов переводов, которые может легко проанализировать gettext.

В Вашем Сценарии PHP звонят bindtextdomain() сообщение его, где Ваш .mo файл расположен. Теперь любые строки передали gettext (или функция подчеркивания) будет переведен.

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

9
задан artemb 13 July 2009 в 11:16
поделиться

5 ответов

Hibernate пытается сделать сохраняемость настолько прозрачной, насколько это возможно, что означает, что он пытается следовать тем же принципам, что и обычные объекты Java. Теперь, перефразируя свой вопрос на Java, вы получите:

Как я могу преобразовать экземпляр класса B в экземпляр (несовместимого) класса C?

И вы знаете ответ на этот вопрос - вы не можете . Вы можете создать новый экземпляр C и скопировать необходимые атрибуты, но B будет всегда B, а не C. Таким образом, ответ на ваш исходный вопрос - это невозможно сделать через JPA. или Hibernate API.

Однако, в отличие от простой Java, с Hibernate вы можете обмануть :-) InheritanceType.SINGLE_TABLE отображается с использованием @DiscriminatorColumn , и для преобразования B в C вы нужно обновить его значение из чего угодно ' s, указанный для B, в то, что указано для C. Уловка заключается в том, что вы не можете сделать это с помощью Hibernate API; вам нужно сделать это через простой SQL. Однако вы можете отобразить этот оператор обновления как именованный запрос SQL и выполнить его с помощью средств Hibernate.

Следовательно, алгоритм следующий:

  1. Исключить B из сеанса, если он существует (это важно)
  2. Выполните именованный запрос.
  3. Загрузите то, что теперь известно как C, используя прежний идентификатор B.
  4. Обновите / установите атрибуты по мере необходимости.
  5. Сохраните C
12
ответ дан 4 December 2019 в 14:30
поделиться

Вы можете использовать свой собственный идентификатор (не сгенерированный) и сделать следующее:

  1. Получить B
  2. открыть транзакцию
  3. удалить B
  4. зафиксировать транзакция
  5. открыть новую транзакцию
  6. создать C и сохранить ее
  7. Закройте вторую транзакцию

Таким образом вы очистите идентификатор из таблицы перед повторной вставкой его как C.

0
ответ дан 4 December 2019 в 14:30
поделиться

Как отличить две сущности в таблице? Я предполагаю, что есть какое-то значение поля (или значения), которое вы можете изменить, чтобы превратить B в C?

У вас может быть метод, в котором вы загружаете суперкласс A и меняете отличительные значения и сохраняете. Тогда в вашем следующем сеансе гибернации ваш B будет C.

0
ответ дан 4 December 2019 в 14:30
поделиться

В этом случае "c" - это объект, о котором сеанс гибернации ничего не знает, но у него есть идентификатор, поэтому предполагается, что объект уже сохранен. В этом контексте persist () не имеет смысла, и поэтому он терпит неудачу.

Javadoc для Hibernate Session.persist () (я знаю, что вы не используете Hibernate API, но семантика такая же, и спящий режим документы лучше) говорит: "Сделайте временный экземпляр постоянным". Если у вашего объекта уже есть идентификатор, он не временный. Вместо этого он думает, что это отдельный экземпляр (т.е. экземпляр, который был сохранен, но не связан с текущим сеансом).

Я предлагаю вам попробовать merge () вместо persist ().

2
ответ дан 4 December 2019 в 14:30
поделиться

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

Возможно, вы не могли указать идентификатор как @GeneratedValue? или один из различных типов стратегии генератора, возможно, чтобы избежать слияния, генерирующего новое значение последовательности,

0
ответ дан 4 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

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