Как получить значение первичного ключа с автоинкрементом в MySQL, используя Hibernate - PullRequest
8 голосов
/ 14 июня 2011

Я использую Hibernate для доступа к MySQL, и у меня есть таблица с автоинкрементным первичным ключом.

Каждый раз, когда я вставляю строку в таблицу, мне не нужно указывать первичный ключ.Но после того, как я вставил новую строку, как я могу получить относительный первичный ключ сразу, используя hibernate?

Или я могу просто использовать jdbc для этого?

Ответы [ 5 ]

10 голосов
/ 14 июня 2011

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

MyThing thing = new MyThing();
...

// save the transient instance.
dao.save(thing);

// after the session flushes, thing.getId() should return the id.

, я фактически почти всегда делаю assertNotNull для идентификатора персистентного объекта в моих тестах, чтобы убедиться, что сохранение сработало.

2 голосов
/ 14 июня 2011

Как только вы сохранили объект, вы сможете вызывать 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;
    }

Это немного сложнее, но это то, что вы можете вырезать и вставлять, кроме изменения имени SEQUENCE.

0 голосов
/ 20 августа 2015

Что ж, в случае класса генератора автоинкремента, когда мы используем метод save(), он возвращает первичный ключ (при условии, что он id).Таким образом, он возвращает этот конкретный id, так что вы можете сделать это

int id = session.save(modelClass);

И вернуть id

0 голосов
/ 14 июня 2011

Если хотите, вы можете получить следующий первичный ключ независимо от объекта, используя:

Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery( "select nextval('schemaName.keySequence')" );

Long key = (Long) query.list().get( 0 );
return key;
0 голосов
/ 14 июня 2011

Когда вы вызываете метод save () в Hibernate, объект не сразу записывается в базу данных. Это происходит либо при попытке чтения из базы данных (из той же таблицы?), Либо при явном вызове flush (). Пока соответствующая запись не вставлена ​​в таблицу базы данных, MySQL не будет выделять для нее идентификатор.

Итак, идентификатор доступен, но не раньше, чем Hibernate фактически вставит запись в таблицу MySQL.

...