Hibernate nextval获取id

时间:2010-10-05 07:35:26

标签: java hibernate orm

我使用带有注释的Hibernate。我需要使用需要一个我需要计算的参数的方法将对象插入数据库,为此我使用:

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

queryString包含:

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

该对象被插入到数据库中,但是当我尝试获取id时,我得到一个空值。

我该怎么办?

当我使用getHibernateTemplate().update(obj);时,我没有获取id的问题,但我需要自定义sql插件。

由于

4 个答案:

答案 0 :(得分:1)

也许我没有得到所有内容,但您是否考虑通过Session#connection()(可能在Hibernate 4中删除)或新的Session#doWork() API使用原始JDBC?如果您需要一个示例,请按照以下方式使用它:

session.doWork(new Work() {
   public void execute(Connection conn) {
      // do work with the connection
      ...
   }
});

答案 1 :(得分:0)

你的问题有点不清楚,但是根据我的理解,我认为你应该先做一个准备好的语句,读取序列的下一个值,并在创建insert语句时使用该id。此外,请确保您提交事务并可能刷新会话。

作为旁注,如果您使用带有注释的Hibernate,则在将表映射到类时,您可以将id生成器作为序列提供。这样,您不必编写jdbc代码来插入实体,只需要简单的hibernate代码,即getJdbcTemplate()。save()。

答案 2 :(得分:0)

以下是使用注释的序列示例:

@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);
}

这些方法来自一个类,而不是从Spring扩展HibernateDaoSupport,这就是他们如何获得hibernate模板。

希望这适合你。

答案 3 :(得分:0)

现在我有了这个:

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(object)inmediatly我在对象中有id,但是当我使用这个方法(加密字段值)时我尝试获取id但它是空的。该对象已正确插入数据库。