Я использую последовательности спящего режима для генерации идентификатора объекта. Я использую PostgreSQL 9.1.Получить идентификатор перед сохранением в базу данных
Возможно ли получить идентификатор объекта до его сохранения в базе данных? Как?
Я использую последовательности спящего режима для генерации идентификатора объекта. Я использую PostgreSQL 9.1.Получить идентификатор перед сохранением в базу данных
Возможно ли получить идентификатор объекта до его сохранения в базе данных? Как?
Метод save() возвращает идентификатор объекта, который был сохранен. Вы можете использовать его!
ссылка: ->http://docs.jboss.org/hibernate/annotations/3.5/api/org/hibernate/Session.html
Вы явно создать отдельную последовательность, получить его значение, а затем вставить объект с идентификатором на основе этого значения. У вас будет больше кода, но идентификатор будет доступен до вставки, а гарантии для последовательностей будут точно такими же, как для серийно заданных идентификаторов, потому что они по существу одинаковы.
Другими словами:
int
не serial
This question имеет ответ, говоря, как получить nex t.
Вы можете реализовать интерфейс 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
}
Эта реализация даст вашей сущности новый идентификатор для каждого чтения из БД, поскольку спящий режим вызывает конструктор по умолчанию через отражение. Кажется, что вы каким-то образом упустили пункт Идентификатор генератора спящего режима. – lost
Действительно, вызов сгенерировать новый идентификатор не должен быть в конструкторе по умолчанию, а в другом конструкторе. Я изменю свой пост. –
Это не то, что ОП просили - требование было «прежде чем он будет сохранен» – kostja
Но дело в том, что сохранить() на самом деле не сохранить объект. Он сохраняется только при следующем скрытии (неявный или неявный). –