我使用带注释的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 insert。
谢谢
发布于 2010-10-05 16:37:57
也许我没有得到所有的东西,但是你有没有考虑过通过Session#connection() (可能在Hibernate 4中删除)或者新的Session#doWork()应用程序接口来使用原始的JDBC?如果你需要一个例子,下面是你如何使用它的:
session.doWork(new Work() {
public void execute(Connection conn) {
// do work with the connection
...
}
});发布于 2010-10-05 20:21:35
您的问题有点不清楚,但根据我的理解,我认为您应该首先编写一个准备好的语句,读取序列的下一个值,并在创建insert语句时使用该id。此外,请确保提交事务,并可能刷新会话。
顺便说一句,如果您正在使用带注释的Hibernate,则在将表映射到类时,您可以将id生成器作为序列提供。这样,您不必编写jdbc代码来插入实体,只需编写普通的hibernate代码,即getJdbcTemplate().save()。
发布于 2010-10-05 20:51:12
下面是一个使用注释的序列示例:
@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模板的。
希望这对你有用。
https://stackoverflow.com/questions/3861670
复制相似问题