Могу ли я переопределить сгенерированные идентификаторы? - PullRequest
2 голосов
/ 08 ноября 2010

Я использую JPA 1, Hibernate и Oracle 10.2.0, и мои сущности определены следующим образом:

@Entity
@Table(name="TERMS")
public class Term implements Serializable {
    @Id
    @GenericGenerator(name = "generator", strategy = "guid", parameters = {})
    @GeneratedValue(generator = "generator")
    @Column(name="TERM_ID")
    private String termId;
}

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

Тем не менее, я продолжал действовать, когда мои сущности с существующими идентификаторами, похоже, очень злили Hibernate.Так возможно ли это на самом деле или лучше не удалять их и просто пытаться сделать это слиянием?

Angriness из hibernate:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.idbs.omics.catalog.entity.Term

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

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

Действительно, вы не можете назначить Id, когда он должен быть сгенерирован, по крайней мере, не в Hibernate, который не будет рассматривать сущность как new , но как detached ( Спецификация JPA немного размыта в отношении точных правил в этом случае, но именно так Hibernate ведет себя, см. 5.1.4.5. Присвоенные идентификаторы для дополнительных подсказок).

Так возможно ли это на самом деле или лучше не удалять их и просто пытаться сделать это слиянием?

Чтобы сделать возможным удаление / вставку для варианта использования веб-службы, вам необходимо:

  • не назначать идентификатор ~ или ~
  • использовать специальную версию сущности без сгенерированного идентификатора ~ или ~
  • использование массовых операций (?)

Альтернативой, если вы на самом деле обновляете отсоединенные сущности, будет действительно использовать merge (но взгляните на эти предыдущие вопросы просто в случае).

Какой подход лучше? Я не знаю, думаю, это зависит от ваших потребностей. Последнее кажется более естественным, если вы обновляете существующие объекты. В первом случае вы действительно получите «новые» объекты (включая новое значение для столбца оптимистической блокировки). В зависимости от точной реализации процесса производительность также может отличаться. И, кстати, как насчет параллелизма (просто чтобы упомянуть, я действительно не ожидаю ответа)?

0 голосов
/ 08 ноября 2010

Вы можете использовать EntityManager.merge для сохранения обновленной версии объекта.Имейте в виду, что это возвращает другой объект, чем тот, который вы передаете ему, потому что он в основном выбирает сущность из базы данных, обновляет постоянные свойства из передаваемого вами объекта и сохраняет постоянный объект.

См. http://blog.xebia.com/2009/03/23/jpa-implementation-patterns-saving-detached-entities/ для получения дополнительной информации по этой проблеме.

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