Spring-HIbernate: идентификатор объекта до сохранения объекта - PullRequest
1 голос
/ 03 ноября 2011

Как получить идентификатор вновь сохраненного объекта до завершения транзакции при использовании аннотации @Transactional .?

Допустим, у меня есть таблица User, идентификатор которой генерируется последовательностью базы данных ..

User.java

 @Entity
 public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USERSEQ")
    @SequenceGenerator(name="USERSEQ", sequenceName = "USERSEQ")
    @Column(name="ID", nullable=false)
    private int id;

    @Column(name="FIRSTNAME", nullable=false)
    private String firstName;

    @Column(name="LASTNAME", nullable=false)
    private String lastName;
  }

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

UserService.java

  @Transactional
  public void addUser(User newUser, UserAudit userAudit ){
         newUser = userDao.addUser(newUser);
         userAudit.setUserId(newUser.getId());
         userAuditDao.addUserAudit(userAudit);
  }

Я пытался очистить сеанс перед возвратом пользовательского объекта из слоя дао, но, похоже, он не работает ...

UserDao.java

  public User addUser(User user){
     Session session = sessionFactory.getCurrentSession();
     user = (User) session.merge(user);
      session.flush();
    return user;
  }

Так что же делатьМне нужно здесь, чтобы получить идентификатор в слое обслуживания до завершения транзакции?ТИА.

1 Ответ

1 голос
/ 03 ноября 2011

Я думаю, что вы хотите session.save (пользователь) или session.saveOrUpdate (пользователь). Согласно JavaDocs:

merge (String entityName, Object object) - копировать состояние данного объекта в постоянный объект с тем же идентификатором.

save (Object object) - сохранить данный временный экземпляр, сначала назначив сгенерированный идентификатор

Я думаю, что для слияния требуется уже сохраненная сущность, поэтому merge () / flush () вам ее не дает. Однако сохранить () / flush () следует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...