Получить идентификатор первичного ключа перед продолжением использования sessionfactory в спящем режиме

Я использовал приведенный ниже код, чтобы получить первичный ключ в спящем режиме перед сохранением объекта. Но это вставка повторяющихся строк в БД.

Проблема, с которой я столкнулся, заключается в следующем: 1. Я получаю два значения первичного ключа. Первый, когда я вызываю метод flushPerson () для получения идентификатора перед сохранением объекта Person. 2. Другое, когда я вызываю метод save, чтобы сохранить объект Person. В этом методе также увеличивается «Id».

PersonController.java

public Person createNewPerson(String .....){
    Person per = new Person();
    personManager.flushPerson(per);
    RandomNumberGenerator rng = new RandomNumberGenerator();
    String randomStrng = rng.generateRandomNumber();
    String cientCode = per.getId()+randomStrng;
    per.setPersonClientCode(cientCode);
    per.setPersonClient();
    per.setPersonField();
    personManager.save(per);
}

PersonHibernateDao.java

@Override
public void flushPerson(Person per) {       
    sessionFactory.getCurrentSession().persist(per);
    sessionFactory.getCurrentSession().flush(); 
}

@Override
public void save(Person per) {
    sessionFactory.getCurrentSession().save(per);
}

Что мне здесь не хватает? Я хочу сохранить объект только с идентификатором первичного ключа, который создается методом flush, и он должен вставлять только одну строку.

при сохранении в базе данных распечатайте Человек p = personManager.save (per); саут (p.getId ()); и проверьте, получаете ли вы идентификатор или нет, если вы получили идентификатор, верните его :)

Navin Gelot 10.08.2018 12:14

@Navin Gelot, я получаю идентификатор, но проблема в том, что я получаю два увеличенных идентификатора. один в, когда я вызываю flushPerson () ex: предположим, что здесь id будет 5, здесь он хранит одну строку с первичным ключом как 5 в БД. Другой - в save (Person), где он хранит 6 в качестве первичного ключа в БД.

daisy 10.08.2018 13:08

Затем просто используйте один из flush () и save (), а не оба.

Soutzikevich 10.08.2018 16:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
229
1

Ответы 1

Измените способ сохранения на:

@Override
public Person save(Person per) {
 return sessionFactory.getCurrentSession().save(per);
}

Затем в PersonController вы можете:

Person per = new Person();
//whatever Mutators you need
per = personManager.save(per);
//Now you can get id and no duplicate rows will be inserted

если я использую только flush (), будет ли транзакция зафиксирована в текущем сеансе?

daisy 13.08.2018 07:45

Другие вопросы по теме