Как получить значение первичного ключа 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