2019年9月18日 星期三

以Hibernate設計進行1對1資料表寫入資料


有時將資料寫入資料庫時須連帶寫入,例如好不容易有會員前來網站註冊,此時將基本資料寫入A資料表,其餘資料寫入B資料表,此時應該怎麼做呢?



以書籍資料及書籍資料細節當例子,思考邏輯如下:

1. 先建立2個表格並設計欄位名稱、型別、主鍵(Primary key)、不能為空(not null)...等等。

2. 建立2個名稱與表格名稱相同的Bean(.class)

3. 先給定另一方欲對應表格的Bean,再給定自身對應表格的欄位型別,之後偷懶用eclipse的getter/setter建立工具(Generate Getters and Setters...)將各自的方法建立起來。

4. 再建立各自的映射文件(*.hbm.xml),注意:
    表格的名稱要對
    調整generator class(共有7種,簡單介紹2種):
        1. identity→採用資料庫提供的主鍵生成機制
        2. foreign→使用另一個相關的識別符號作為主鍵(如使用foreign,需另給定參數)
    關聯性(Relationship):
        主表的映射文件中,需增加「cascade="all"或"save-update"或"delete"」

5. 最後實作java,各自產生bean之後塞入欲設定值,將bean各自設定給對方後,再使用新增方法(.save())帶入主表的bean,即可將資料同時寫入2個1對1的資料表中。


eg.
public class DemoHibernateBook1to1Action {

public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.openSession();
try {
session.beginTransaction();

BookBean bBean = new BookBean();
bBean.setBookname("Harry Potter");
bBean.setAuthor("J.K Rowling");
bBean.setPrice(700);

BookDetailBean bdBean = new BookDetailBean();
bdBean.setPublisher("Crown");
bdBean.setPublisheraddress("Taiwan");

bBean.setBookdetail(bdBean);
bdBean.setBook(bBean);

session.save(bBean);

session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} finally {
session.close();
HibernateUtil.closeSessionFactory();
}
}

以上,同行見笑,
如有任何指教請不吝留言告知,謝謝。

沒有留言:

張貼留言

無暇的程式碼(Clean code)金句

The only valid measurement of code quality: WTFs/minute.