Подтвердить что ты не робот

Как использовать сгенерированное значение в составных ключах?

У меня есть два документа documentlog и documentversion (с первичными ключами: int doc_id и int docVersionID) со многими отношениями. Я использовал составной класс ключей CompundKey для управления составным первичным ключом. Мне нужно автоматически увеличивать docversionID, но я не могу этого сделать. Не могли бы вы помочь мне в этом отношении?

@Entity
@Table(name = "Documentversion", schema = "DocumentManagement")
public class DocumentVersion implements Serializable { 

 private CompoundKey id;
 private List<DocumentLog> documentLog;

 @OneToMany(mappedBy="documentVersion", targetEntity=DocumentLog.class,  
   cascade ={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
 public List<DocumentLog> getDocumentLog() {
  return documentLog;
 }
 public void setDocumentLog(List<DocumentLog> documentLog) {
  this.documentLog = documentLog;
 }

 @EmbeddedId 
 @AttributeOverride(name="doc_Id", [email protected](name="doc_Id") )
 public CompoundKey getId() {
  return id;
 }
 public void setId(CompoundKey id) {
  this.id = id;
 } 
}
4b9b3361

Ответ 1

Документация немного запутанна в этой теме...

Насколько мне известно, составные ключи всегда должны были быть назначены приложением (то есть не сгенерированным), по крайней мере, со стандартным JPA, но также с гибернатным ядром:

8.4. Компоненты как составные идентификаторы

...

Вы не можете использовать IdentifierGenerator для создания составных клавиш. Вместо приложение должно идентификаторы.

Но на практике все может быть немного по-другому (см. HHH-2060 и/или этот поток для альтернативы с использованием CompositeUserType вместе с IdentifierGenerator).

Теперь, самая запутанная часть, из документации Hibernate Annotations 3.5:

2.2.3.2.4. Генерация частичного идентификатора

Hibernate поддерживает автоматическое генерация некоторого идентификатора свойства. Просто используйте @GeneratedValue аннотация на одном или несколько свойств id.

...

Вы также можете создавать свойства внутри класса @EmbeddedId.

(и, пожалуйста, также прочитайте предупреждение команды Hibernate против использования этой функции).

У меня нет практического опыта, хотя.

Ссылки

Ответ 2

Можно объявить свой generator для @EmbeddedId, чтобы использовать последовательность для генерации Id.

Кроме того, вам нужно будет объявить поддельный объект для автоматического создания последовательности.