2010-10-05 127 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