Hibernate nextval получить идентификатор - PullRequest
2 голосов
/ 05 октября 2010

Я использую Hibernate с аннотациями. Мне нужно вставить объект в базу данных, используя метод, которому нужен один параметр, который мне нужно рассчитать, для этого я использую:

SQLQuery sqlQuery = getSession().createSQLQuery(queryString);
sqlQuery.executeUpdate();

Строка запроса содержит:

INSERT INTO TABLE(ID, NUMBER) VALUES (SEC_TABLE.NEXTVAL, 549)

Объект вставлен в базу данных, но когда я пытаюсь получить идентификатор, я получаю нулевое значение.

Что я могу сделать?

Когда я использую getHibernateTemplate().update(obj); У меня нет проблем с получением идентификатора, но мне нужно настроить вставку SQL.

Спасибо

Ответы [ 4 ]

1 голос
/ 05 октября 2010

Может быть, я не получил все, но вы рассматривали возможность использования raw JDBC либо через Session#connection() (может быть удалено в Hibernate 4), либо с новым Session#doWork() API?Если вам нужен пример, вот как вы его используете:

session.doWork(new Work() {
   public void execute(Connection conn) {
      // do work with the connection
      ...
   }
});
0 голосов
/ 07 октября 2010

Теперь у меня есть это:

public void sql(final String query) {
    getHibernateTemplate().execute(new HibernateCallback<Object>() {
        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            Query q = session.createSQLQuery(query);
            q.executeUpdate();
            return null;
        }
    });
}

Запрос:

INSERT INTO TABLE (ID, VALUE) VALUES (SEC.NEXTVAL, crypt(1, paswword))

Метод, который я использую:

public void insert(MyClass object) {
    String password = confFile.getProperty("CRYPT");
    String query = createQuery(object, password);
    sql(query);
}

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

0 голосов
/ 05 октября 2010

Вот пример последовательностей, использующих аннотации:

@Id
@Column(name = "OFFER_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OFR_OFFERS_SEQ")
@SequenceGenerator(name = "OFR_OFFERS_SEQ", sequenceName = "OFR_OFFERS_SEQ", allocationSize = 1)
private Long offerId;

Кроме того, метод add должен выглядеть следующим образом:

public <T> T add(final T obj) {
     return get(obj.getClass(), (Long) getHibernateTemplate().save(obj));
}
public final <T> T get(final Class<T> clazz, final Long id) {
     return (T) getHibernateTemplate().get(clazz, id);
}

Методы из класса, который расширяет HibernateDaoSupport изВесна, вот как они получают шаблон гибернации.

Надеюсь, это работает для вас.

0 голосов
/ 05 октября 2010

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

В качестве примечания: если вы используете Hibernate с аннотациями, при отображении таблицы в класс вы можете предоставить генератор идентификаторов в виде последовательности,Таким образом, вам не нужно писать jdbc-код для вставки сущности, просто код гибернации, то есть getJdbcTemplate (). Save ().

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