Как получить значение первичного ключа auto-increment в MySQL, используя Hibernate
Я использую Hibernate для доступа к MySQL, и у меня есть таблица с автоинкрементным первичным ключом.
каждый раз, когда я вставляю строку в таблицу, мне не нужно указывать первичный ключ. Но после вставки новой строки, как я могу получить относительный первичный ключ сразу с помощью hibernate?
или я могу просто использовать JDBC для этого?
5 ответов
когда вы сохраняете объект hibernate,id
свойство будет заполнено для вас. Так что если у вас есть
MyThing thing = new MyThing();
...
// save the transient instance.
dao.save(thing);
// after the session flushes, thing.getId() should return the id.
Я на самом деле почти всегда делаю assertNotNull
на id сохраненной сущности в моих тестах, чтобы убедиться, что сохранение сработало.
после сохранения объекта вы сможете вызвать getId () или любой другой столбец @ID, чтобы вы могли вернуть его из своего метода. Вы также можете аннулировать кэш первого уровня Hibernate и получить его снова.
однако для переносимости вы можете посмотреть на использование Hibernate с генерацией идентификатора стиля последовательности. Это облегчит переход от MySQL, если вам когда-либо понадобится. Конечно, если вы используете этот стиль генератора, вы сможете получить идентификатор немедленно, потому что Hibernate должен разрешить значение столбца, прежде чем он сохранит объект:
@Id
@GeneratedValue (generator="MY_SEQ")
@GenericGenerator( name = "MY_SEQ",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "MY_SEQ"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "10") }
)
@Column ( name = "id", nullable = false )
public Long getId () {
return this.id;
}
это немного сложнее, но это то, что вы можете вырезать и вставить, кроме изменения имени последовательности.
при вызове метода save () в спящем режиме объект не записывается в базу данных немедленно. Это происходит при попытке чтения из базы данных (из той же таблицы?) или явно вызывать flush(). Пока соответствующая запись не будет вставлена в таблицу базы данных, MySQL не выделит для нее идентификатор.
Итак, идентификатор доступен, но не до того, как Hibernate фактически вставляет запись в таблицу MySQL.
Если вы хотите, вы можете получить следующий первичный ключ независимо от объекта, используя:
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery( "select nextval('schemaName.keySequence')" );
Long key = (Long) query.list().get( 0 );
return key;
Ну в случае класса генератора автоматического приращения, когда мы используем save()
метод возвращает первичный ключ (если его id
). Таким образом, он возвращает это конкретное id
, Так что вы можете сделать это
int id = session.save(modelClass);
и возврат id