2010-10-05 122 views
2

我使用Hibernate注释。我需要使用谁需要一个参数,我需要计算方法插入对象到数据库中,要做到这一点,我使用:休眠nextval获取ID

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

查询字符串包含:

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

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

我该怎么办?

当我使用getHibernateTemplate().update(obj);我没有问题得到id,但我需要自定义sql插入。

感谢

回答

1

也许我没有得到的一切,但你可以考虑使用原始JDBC或者通过Session#connection()(可能在Hibernate中4被移除)或新Session#doWork() API?如果你需要一个例子,这里是你如何使用它:

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

如果这没有帮助,请澄清您的问题,我没有得到与id(即为空)的问题。 – 2010-10-05 08:38:40

+0

我更喜欢不使用原始JDBC。我尝试使用session.doWork,但它仍然有空值 – Michel 2010-10-05 08:49:35

+0

@Michel在哪里“你有空值”?我不明白,请解释发生了什么以及预期的结果。 – 2010-10-05 09:08:56

0

你的问题有点不清楚,但我的理解,我认为你应该先准备好的语句读取下一个值对于序列并在创建插入语句时使用该ID。另外,请确保您提交事务并刷新会话。作为一个方面说明,如果您将Hibernate与注释一起使用,将表映射到类时,您可以将id生成器作为序列提供。这样,您不必编写jdbc代码来插入实体,只需简单的hibernate代码即getJdbcTemplate()。save()。

+0

我使用注释生成了secuence,但是当我尝试查看该值为null时。 – Michel 2010-10-05 12:27:49

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

的方法是从比从弹簧延伸的HibernateDaoSupport,这就是一个类他们如何获得hibernate模板。

希望这对你有用。

+0

是的,我有这个,但我需要做一个自定义插入,所以我必须创建一个@SQLInsert或SQLQuery sqlQuery = getSession()。createSQLQuery(queryString); sqlQuery.executeUpdate(); – Michel 2010-10-05 12:59:51

+0

我不明白自定义插入是什么意思,你需要做什么。也许你可以详细阐述一下? – virgium03 2010-10-05 13:09:00

+0

我想插入一个对象,但也想调用一个过程:INSERT INTO TABLE(ID,value)VALUES(NEXTVAL,crypt(?,pwd))。但我需要阅读一个文件,所以我不能把地下室(?,'MYPASSWORD) – Michel 2010-10-06 07:43:38

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

+0

我意识到我错了......使用查询的对象不可能自动获得id。 我如何才能获取最后一个查询得到的ID? – Michel 2010-10-08 07:00:15

+0

创建一个PreparedStatement,其中包含如下内容:从your_table y中选择y.id y其中... – virgium03 2010-10-08 07:10:36

+0

或者您可以使用预处理语句在sec.nextval上执行查询,将其存储在Long变量中,并在创建时使用此变量插入sql。 – virgium03 2010-10-08 07:15:13