2013-12-20 3 views

ответ

2

Метод save() возвращает идентификатор объекта, который был сохранен. Вы можете использовать его!

ссылка: ->http://docs.jboss.org/hibernate/annotations/3.5/api/org/hibernate/Session.html

+5

Это не то, что ОП просили - требование было «прежде чем он будет сохранен» – kostja

+4

Но дело в том, что сохранить() на самом деле не сохранить объект. Он сохраняется только при следующем скрытии (неявный или неявный). –

2

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

Другими словами:

  • создать свою собственную последовательность
  • сделать первичный ключ простой int не serial
  • получить номер из последовательности
  • использовать его в качестве идентификатора для объекта

This question имеет ответ, говоря, как получить nex t.

0

Вы можете реализовать интерфейс org.hibernate.id.IdentifierGenerator и создать генератор Id .

Пример:

import com.fasterxml.uuid.Generators; 
import com.fasterxml.uuid.impl.TimeBasedGenerator; 

public class TimeBasedIDGenerator implements IdentifierGenerator { 

    private static TimeBasedGenerator generator = Generators.timeBasedGenerator(); 

    private static TimeBasedIDGenerator SINGLETON = new TimeBasedIDGenerator(); 

    public static UUID generate() { 
     return SINGLETON.generateUUID(); 
    } 

    @Override 
    public Serializable generate(SessionImplementor session, Object parent) throws HibernateException { 
     return generator.generate();; 
    } 
} 

Это может быть использовано в ваших лиц, как это. Таким образом, идентификатор генерируется конструктору:

@Entity 
public EntityClassName { 

    private UUID uuid; 
    private Integer mandatoryField; 

    public EntityClassName() { 
    } 

    public EntityClassName(Integer mandatoryField) { 
     this.uuid = TimeBasedIDGenerator.generate(); 
     this.mandatoryField = mandatoryField; 
    } 


    @Id 
    @Column(name = COLUMN_XXX_UUID) 
    @Type(type = "java.util.UUID") 
    public UUID getUuid() { 
     return uuid; 
    } 

    // setter + other properties 

} 
+0

Эта реализация даст вашей сущности новый идентификатор для каждого чтения из БД, поскольку спящий режим вызывает конструктор по умолчанию через отражение. Кажется, что вы каким-то образом упустили пункт Идентификатор генератора спящего режима. – lost

+0

Действительно, вызов сгенерировать новый идентификатор не должен быть в конструкторе по умолчанию, а в другом конструкторе. Я изменю свой пост. –

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