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

У меня есть два класса 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;
 } 
}

person Nick    schedule 08.11.2010    source источник


Ответы (2)


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

Насколько мне известно, составные ключи всегда должны были назначаться приложением (то есть не генерироваться), по крайней мере, со стандартным 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 против использования этой функции).

Хотя у меня нет практического опыта.

использованная литература

person Pascal Thivent    schedule 08.11.2010
comment
Эта область совершенно чистая, как грязь. На самом деле Hibernate уже довольно давно позволяет генерировать весь компонент, составляющий составной ключ; но только через сопоставления hbm.xml, мы никогда не раскрывали это через аннотации. Понятие генерации частичного идентификатора происходит от, о, давайте будем добры и назовем это интересным чтением спецификации JPA командой SpecJ. По сути, они утверждают, что, поскольку спецификация не запрещает это, законно присоединять @GeneratedValue к одному или нескольким сопоставлениям @Id, создающим составной идентификатор. Надеюсь, это поможет. - person Steve Ebersole; 06.06.2012

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

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

person Michail Nikolaev    schedule 18.03.2013