[Java] Hibernate 使用 Annotation 配置

Hibernate 安裝好之後,若用物件內定義註釋 Annotation 的作法如下:

檔案配置

  1. 在 src / main / java 右鍵 New > Other... 搜尋 hibernate,選擇 Hibernate Configuration File (cfg.xml),點 Next 使用預設的檔名 hibernate.cfg.xml 即可(若更動檔名則後續在使用時, .configure() 要另外指定檔名)
  2. 可用他的 Wizard 來輸入完成 cfg.xml ,或直接 Finish ,在檔案右鍵 Open With > Generic Text Editor 手動輸入
  3. 如果 MySQL 的 database 叫 mydb,帳號 root,密碼 abc1234,則 hibernate.cfg.xml 範例如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">abc1234</property>
    
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
    		
        </session-factory>
    </hibernate-configuration>

    • show_sql 是 console 是否顯示 SQL 指令
    • format_sql 是前者是否排版

物件中使用 Annotation:

在 Obj.java 中定義各變數時,要使用 @ 符號 @Entity @Table @Id @Column 來配置與資料庫中的映射
package db
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GenerationType;
import javax.persistence.Column;

@Entity
@Table(name="mytable")
public class Obj {
    @Id          // 主鍵 primary key 對應 varId
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int varId;

    @Column(name="col2")
    private String var2;

    @Column(name="col3")
    private int var3;

    public Obj() {

    }
    public Obj(String var2, int var3) {
        this.var2 = var2;
        this.var3 = var3;
    }

    @Override
    public String toString() {
        return "Obj [varId=" + varId + ", var2=" + var2 + ", var3=" + var3 +"]";
    }
}

持久化物件 Obj 與資料庫 mydb 之中的表格 mytable 互相對應。而物件變數 Integer varId 與資料庫中表格 id 對應;物件變數 String var2 與表格 col2 對應;物件變數 Integer var3 與表格 col3 對應,就如上的配置。@Id 之下是主鍵 primary key "id" 所對應的 varId,而 @GeneratedValue 是定義主鍵增加方式,有 AUTO, IDENTITY, SEQUENCE, TABLE 可以選擇

使用 Hibernate

  1. 有幾個步驟,用 cfg.xml 做 Configuration().configure()、建立 SessionFactory、開啓 Session
  2. 在要使用 Hibernate 的 class 例如 TestIO:
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import java.util.List;
    
    public class TestIO {
    
        private static SessionFactory factory;
    	
        public static void main(String[] args) {
            factory = new Configuration()
                    .configure()
                    .addAnnotatedClass(Obj.class)
                    .buildSessionFactory();
            // 若 hibernate.cfg.xml 檔名不在根目錄或檔名有換,路徑要寫在 .configure()之中
            // 例如 .configure("/dir/hibernate2.cfg.xml")
            
            Session session = factory.openSession();
            // 由 SessionFactory 開啓工作階段
          
            Transaction transaction = session.beginTransaction();
            // 由session開始事務
          
    
    
    
    
            // 開始始用 Hibernate 做 CRUD
    
    
    
    
            
            transaction.commit();   // 提交事務,將上述該存入的存入、該讀出的讀出
            factory.close();       // 關閉SessionFactory
            session.close();       // 關閉session
        }
    }
    

和使用 .hbm.xml 的差別

  • 類別中要有 @ 等註解來定義對應,開始使用時 Configuration() 要有 .addAnnotatedClass(Obj.class)
  • 不需要 Obj.hbm.xml 檔案,而且 hibernate.cfg.xml 之中不需要有 <mapping> 標籤

使用 Hibernate 來做 CRUD 請見連結

留言