Как использовать сгенерированное значение в составных ключах?
У меня есть два документа 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;
}
}
Ответы
Ответ 1
Документация немного запутанна в этой теме...
Насколько мне известно, составные ключи всегда должны были быть назначены приложением (то есть не сгенерированным), по крайней мере, со стандартным JPA, но также с гибернатным ядром:
...
Вы не можете использовать IdentifierGenerator для создания составных клавиш. Вместо приложение должно идентификаторы.
Но на практике все может быть немного по-другому (см. HHH-2060 и/или этот поток для альтернативы с использованием CompositeUserType вместе с IdentifierGenerator).
Теперь, самая запутанная часть, из документации Hibernate Annotations 3.5:
Hibernate поддерживает автоматическое генерация некоторого идентификатора свойства. Просто используйте @GeneratedValue
аннотация на одном или несколько свойств id.
...
Вы также можете создавать свойства внутри класса @EmbeddedId
.
(и, пожалуйста, также прочитайте предупреждение команды Hibernate против использования этой функции).
У меня нет практического опыта, хотя.
Ссылки
- Справочное руководство по Hibernate Core
- Hibernate Annotations 3.5 Справочное руководство
Ответ 2
Можно объявить свой generator для @EmbeddedId, чтобы использовать последовательность для генерации Id.
Кроме того, вам нужно будет объявить поддельный объект для автоматического создания последовательности.