2010-11-08 4 views
2

Я использую 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-представление Entity (и дочерние организации) будет приходить в через веб-службу для обновления/замены существующих. Моя мысль заключалась в том, чтобы просто удалить старые и повторно создать его из входящего XML.

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

Angriness из спящего режима:

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

Благодаря

+0

Я в конечном итоге назначил свои собственные идентификаторы, и он просто работает :) – willcodejavaforfood

ответ

2

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

В самом деле, вы не можете назначить Id, когда он должен быть создан, по крайней мере, не с Hibernate, что не будет рассматривать субъект как новый, но как отсоединенный (спецификация JPA немного размыта по точным правилам в этом случае, но вот как ведет себя Hibernate, см. 5.1.4.5. Assigned identifiers для получения дополнительных подсказок).

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

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

  • не присвоить идентификатор ~ или ~
  • использовать специальную версию объекта без сгенерированного идентификатора ~ или ~
  • использование bulk operations (?)

в качестве альтернативы, если вы на самом деле обновления отдельно снятые лица будут действительно использовать merge (но посмотрите на них previousquestions на всякий случай).

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

+0

Я был немного осторожен в использовании слияния сначала, поскольку «обновленные» сущности, которые проникают через веб-службы, могут иметь много изменений внутри и где дети были добавлены/удалены. Не совсем уверен, как это сработало бы. Чтобы сохранить идентификатор, это требование, поэтому ничего не могу с этим поделать. Я не буду отвечать на вопрос о параллелизме :) – willcodejavaforfood

+0

Слияние не будет сохраняться в новых сущностях даже с каскадом = Слияние, Персист? – willcodejavaforfood

+0

@willcodejavaforfood: Я думаю, что некоторые испытания будут приветствоваться. Что касается второго комментария, да, 'merge' будет сохраняться * new * сущностями (я имею в виду, действительно * new *, не слишком уверенным в отношении данных, связанных с Id). –

0

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

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

Смежные вопросы