Я использовал приведенный ниже код, чтобы получить первичный ключ в спящем режиме перед сохранением объекта. Но это вставка повторяющихся строк в БД.
Проблема, с которой я столкнулся, заключается в следующем: 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, и он должен вставлять только одну строку.
@Navin Gelot, я получаю идентификатор, но проблема в том, что я получаю два увеличенных идентификатора. один в, когда я вызываю flushPerson () ex: предположим, что здесь id будет 5, здесь он хранит одну строку с первичным ключом как 5 в БД. Другой - в save (Person), где он хранит 6 в качестве первичного ключа в БД.
Затем просто используйте один из flush () и save (), а не оба.
Измените способ сохранения на:
@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 (), будет ли транзакция зафиксирована в текущем сеансе?
при сохранении в базе данных распечатайте Человек p = personManager.save (per); саут (p.getId ()); и проверьте, получаете ли вы идентификатор или нет, если вы получили идентификатор, верните его :)