天天看點

第一個Hibernate示例1、建立Hibernate 工程2、填充POJO等元件3、引入log4j3、小結

回到首頁☞

不動手永遠不知道看似簡單的東西有哪些細節。

用第一個HIbernate,來看下Hibernate有哪些組成部分。

IDEA+Maven

1、建立Hibernate 工程

Hibernate 不依賴任何容器,是以搞一個簡單Java 工程即可。

1.1、建立一個簡單的Java工程

注意勾選set up libaray later

第一個Hibernate示例1、建立Hibernate 工程2、填充POJO等元件3、引入log4j3、小結

1.2、轉成Maven工程

工程右鍵 add Framework Support支援,選擇Maven。

1.3、引入Hibernate支援的Pom

因為我們使用别人開發的架構,沒什麼技術,而比較難的是了解一個架構到底需要依賴哪些資源,尤其是版本對應關系。

相信玩過kafka的,自己搭建所有依賴因為版本問題,被玩的體無完膚。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>Hibernate</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>HibernateMavenTest</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加Hibernate依賴 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.6.10.Final</version>
        </dependency>

        <!-- 添加Log4J依賴 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.6.4</version>
        </dependency>

        <!-- 添加javassist -->
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.0.GA</version>
        </dependency>

        <!-- mysql資料庫的驅動包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>

</project>

           

1.4、hibernate.cfg.xml換個位置

hibernate.cfg.xml 放到resource跟目錄下

2、填充POJO等元件

2.1 添加一個EmploeeVO

這個POJO就是和背景表對應的。

package com.wht.vo;

import javax.persistence.*;
import java.util.Date;

/**
 * @author JDIT
 */
@Entity
@Table(name = "t_emp")
public class EmployeeVO {
  @Column(name = "dept_no")
  private Integer deptNo;
  @Column(name = "hire_date")
  private Date hireDate;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;
  @Column(name = "ename")
  private String name;
  @Column(name = "salary")
  private Double salary;

  public Integer getDeptNo() {
    return deptNo;
  }

  public void setDeptNo(Integer deptNo) {
    this.deptNo = deptNo;
  }

  public Date getHireDate() {
    return hireDate;
  }

  public void setHireDate(Date hireDate) {
    this.hireDate = hireDate;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Double getSalary() {
    return salary;
  }

  public void setSalary(Double salary) {
    this.salary = salary;
  }
}

           

2.2 配置核心檔案hibernate.cfg.xml

可以看到許許多多的架構,都是以配置為核心的,這決定這個架構初始化成什麼樣,能否打通各個中間件和生命周期,完成各個元件的啟動。

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/dev?serverTimezone=GMT%2B8</property>
        <property name="connection.username">dev</property>
        <property name="connection.password">hcgk*2020</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">10</property>

        <!-- Disable the second-level cache -->

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- Drop and re-create the database schema on startup -->

        <property name="hbm2ddl.auto">create</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Names the annotated entity class -->
        <mapping class="com.wht.vo.EmployeeVO" />

    </session-factory>
</hibernate-configuration>

           

2.3、寫個Client 類進行測試

package com.wht.service;

import com.wht.vo.EmployeeVO;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import java.util.Date;

/**
 * @author JDIT
 */
public class Test {
  public static void main(String[] args) {
    //執行個體化Configuration
    //configure()方法預設加載  /hibernate.cfg.xml
    Configuration conf = new Configuration().configure();
    //用Configuration建立SessionFactory
    SessionFactory sf = conf.buildSessionFactory();
    //用SessionFactory打開Session
    Session sess = sf.openSession();
    //開始事務
    Transaction tx = sess.beginTransaction();
    //建立消息執行個體
    EmployeeVO employeeVO = new EmployeeVO();
    //設定消息标題和消息内容
    employeeVO.setName("王予希");
    employeeVO.setDeptNo(1);
    employeeVO.setSalary(20000.00);
    employeeVO.setHireDate(new Date());

    //儲存消息
    sess.save(employeeVO);
    //送出事務
    tx.commit();
    //關閉session 和 SessionFactory
    sess.close();
    sf.close();
    System.out.println("執行完畢");
  }
}

           

3、引入log4j

任何架構列印log日志是必不可少的。

3.1 增加log4j配置

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[ %p ]%m%n


### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout 

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug 

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

           

3.2 test類中 引入

package com.wht.service;

import com.wht.vo.EmployeeVO;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import java.util.Date;

/**
 * @author JDIT
 */
public class Test {
  public static void main(String[] args) {
    Logger logger = Logger.getLogger(Test.class);
    //執行個體化Configuration
    //configure()方法預設加載  /hibernate.cfg.xml
    Configuration conf = new Configuration().configure();
    //用Configuration建立SessionFactory
    SessionFactory sf = conf.buildSessionFactory();
    //用SessionFactory打開Session
    Session sess = sf.openSession();
    //開始事務
    Transaction tx = sess.beginTransaction();
    //建立消息執行個體
    EmployeeVO employeeVO = new EmployeeVO();
    //設定消息标題和消息内容
    employeeVO.setName("王予希");
    employeeVO.setDeptNo(1);
    employeeVO.setSalary(20000.00);
    employeeVO.setHireDate(new Date());

    //儲存消息
    sess.save(employeeVO);
    //送出事務
    tx.commit();
    //關閉session 和 SessionFactory
    sess.close();
    sf.close();
    logger.info("執行完畢");
  }
}

           

3、小結

  • 上面demo是使用注解方式,VO直接映射表 t_emp
  • hibernate.cfg.xml是核心,位置和配置項都是關鍵
  • < property name=“hbm2ddl.auto”>create< /property>這是個坑,看似很強大,一個系統涉及DB的DDL不是那麼随意的,通過程式自動建立是個坑。第一次玩這個,直接把我之前設計好的表重建了。如果真實業務系統,做了個基本可以跑路了。
  • Configuration、SessionFactory 、Session 、Transaction 是核心元件,需要深入吃透。
  • log4j配置要吃透,前面有專門的記錄整理,很好一個程式運作跟蹤工具,對接日志之後,問題定位将更加友善。

回到首頁☞