Как я могу использовать сгенерированное значение в составных ключах? - PullRequest
13 голосов
/ 08 ноября 2010

У меня есть два класса 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", column=@Column(name="doc_Id") )
 public CompoundKey getId() {
  return id;
 }
 public void setId(CompoundKey id) {
  this.id = id;
 } 
}

Ответы [ 2 ]

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

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

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

8,4. Компоненты в качестве составных идентификаторов

...

Вы не можете использовать IdentifierGenerator генерировать составные ключи. Вместо приложение должно назначить свое собственное идентификаторы.

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

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

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

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

...

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

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

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

Ссылки

0 голосов
/ 18 марта 2013

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

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

...