Получение идентификатора (PK) недавно сохраненного объекта - PullRequest
1 голос
/ 10 июня 2011

Я разрабатываю веб-приложение J2EE 6, используя базу данных MySql 5.02.Я пытаюсь создать хэш-дайджест идентификатора, каждый раз, когда я создаю новую сущность.Это настроено на столбец в Таблице.

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

Выполнены следующие шаги:

  1. Создание экземпляра объекта -> userCard = new Users();
  2. Установка соответствующих полей с некоторыми значениями.
  3. Вызов persist() метода EntityManager.

Прочитав некоторые форумы, я понял, что мне нужно либо позвонить flush() после persist(), либо использовать merge() и использоватьвозвращаемая сущность для получения идентификатора.

public void createAndFlush(Users users) {
    em.persist(users);
    em.flush();
}

public Integer edit(Users users) {
    return ((Users)em.merge(users)).getIdvcards();
}

Ни одна из них (среди некоторых других комбинаций) не работает, ну, сущность успешно сохраняется, но поле идентификатора возвращает ноль.

Этиявляются соответствующими аннотациями столбца id, который я хочу получить:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idvcards")
private Integer idvcards;

И, очевидно, для idvcards столбца моей таблицы установлено значение Автоинкремент и Первичный ключ.

Может быть, яМне нужно уточнить мои концепции управления постоянством, но я был бы признателен, если бы мне удалось получить подсказку для решения этой основной проблемы.

Ответы [ 3 ]

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

Возможно, это не самое элегантное решение за всю историю, но, наконец, мне удалось получить идентификатор новой сущности:

public Integer create(User user) {
    em.persist(users);
    em.flush();
    return (Integer) em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(users);
}

И, хотя это не связано с функциональностью, я изменил имя сущности на единственную форму, как предложил @Bohemian.

1 голос
/ 10 июня 2011

Попробуйте, у меня все работает:

@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)

Кроме того, я не использую значение, возвращаемое из merge. Я просто persist затем flush и объект сущности волшебным образом получает новое значение ключа.

p.s. Таблицы никогда не должны быть названы во множественном числе, и особенно не класс сущности. Позвоните классу User (и стол, если вы можете). В противном случае это просто сбивает с толку: Users звучит как коллекция User.

0 голосов
/ 25 апреля 2013

Это будет нормально работать

em.persist(usmApproveTransaction);
em.flush();

System.out.println("++++++e++++++++"+usmApproveTransaction.getUatApproveTransIdPk());
return usmApproveTransaction;

Я получаю идентификатор, используя em.flush(); после persist

++++++ e ++++++++ 51472

...