每當執行PK的增刪改時,控制台都會出現一些SQL語句,當然要看見也得在cfg.xml設show_sql和format_sql(可選)為true才行,但如果想改成自己想要的,就要如下的設定
官方還有加@NamedNativeQuery配合使用的,但我沒試出來
※XML設定
Dept.hbm.xml
<class> <!-- ... --> <sql-insert>insert into dept (dname, loc, deptno) values (upper(?), lower(?), ?)</sql-insert> <sql-update>update dept set dname = upper(?), loc = lower(?) where deptno = ?</sql-update> <sql-delete>delete from dept d where d.deptno = ?</sql-delete> </class>
測試類
Session s = HibernateUtil2.getSession(); Transaction tx = s.beginTransaction(); try { Dept d = new Dept(); d.setDeptno(52); d.setDname("a"); d.setLoc("d"); s.save(d); // update、delete tx.commit(); } catch (Exception e) { tx.rollback(); System.err.println("例外錯誤!"); e.printStackTrace(); } finally { if (s.isOpen()) { s.close(); } }
※新增和修改我發現一定要把所有的欄位都打出來,不然會出「無效的資料欄索引」的錯
※還要注意原本的SQL在控制台是怎麼顯示的,我debug好久才發現它把PK的「?」放在最後一個,其他隨便放就可以對應到,很怪
※而新增時我有sequence,但用了這招後,已經沒用了,可能很要用其他的方法才行,目前沒想到,我自己寫一個資料庫沒有的PK,是可以新增成功的
※Annotation設定
可寫在TYPE,FIELD、METHOD,下面是寫在TYPE的例子Dept.java
@SQLInsert(sql = "insert into dept (dname, loc, deptno) values (upper(?), lower(?), ?)") @SQLUpdate(sql = "update dept set dname = upper(?), loc = lower(?) where deptno = ?") @SQLDelete(sql = "delete from dept d where d.deptno = ?") @SQLDeleteAll(sql = "delete from Dept d") @Entity @Table public class Dept { //... }
※@SQLDeleteAll不知要怎麼使用
※以下我沒有實驗過:
不管XML或Annotation還有2個屬性
.callable,true/false,是否使用stored procedure,預設是false
.另外一個xml是check,annotation是ResultCheckStyle,是檢查stored procedure是否成功用的
none/NONE:不檢查,預設
rowcount/COUNT:使用rowcount來檢查是否成功
param/PARAM:像rowcount,但是是使用輸出參數和標準機制做比較(有看沒有懂?)
沒有留言:
張貼留言