Java 在hibernate中使用sessionfactory持久化之前检索主键ID

Java 在hibernate中使用sessionfactory持久化之前检索主键ID,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,在持久化对象之前,我使用以下代码在hibernate中获取主键。但它会在DB中插入重复的行 我面临的问题是: 1.我得到主键的两个值。当我在持久化Person对象之前调用flushPerson()方法获取“id”时。 2.其他当我调用save方法来保存Person对象时。在这个方法中,“Id”也在递增 PersonController.java public Person createNewPerson(String .....){ Person per = new Person();

在持久化对象之前,我使用以下代码在hibernate中获取主键。但它会在DB中插入重复的行

我面临的问题是: 1.我得到主键的两个值。当我在持久化Person对象之前调用flushPerson()方法获取“id”时。 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);
}
@Override
public void flushPerson(Person per) {       
    sessionFactory.getCurrentSession().persist(per);
    sessionFactory.getCurrentSession().flush(); 
}

@Override
public void save(Person per) {
    sessionFactory.getCurrentSession().save(per);
}
PersonHibernateDao.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);
}
@Override
public void flushPerson(Person per) {       
    sessionFactory.getCurrentSession().persist(per);
    sessionFactory.getCurrentSession().flush(); 
}

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

我错过了什么?我只想用flush方法中创建的主键“id”保存对象,它应该只插入一行。

将保存方法更改为:

@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

在数据库中保存时,Person p=personManager.save(per);sout(p.getId());打印并检查您是否获得了id,如果您获得了id,请返回:)@Navin Gelot我获得了id,但问题是,我获得了两个递增的id。在中,当我调用flushPerson()ex时:假设这里的“id”是5,在这里它存储一行,主键是5,在DB中。另一个在save(Person)中,它将6作为主键存储在数据库中。然后只使用flush()和save()中的一个,而不是两者都使用。如果我只使用flush(),事务将在当前会话中提交吗?