2016年1月16日 星期六

客製化的增刪改 (Hibernate3.x 四十)

對PK的增刪改有用,可參考第四篇

每當執行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,但是是使用輸出參數和標準機制做比較(有看沒有懂?)

沒有留言:

張貼留言