我使用带有注释的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插件。
由于
答案 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但它是空的。该对象已正确插入数据库。