回到首頁☞
不動手永遠不知道看似簡單的東西有哪些細節。
用第一個HIbernate,來看下Hibernate有哪些組成部分。
IDEA+Maven
1、建立Hibernate 工程
Hibernate 不依賴任何容器,是以搞一個簡單Java 工程即可。
1.1、建立一個簡單的Java工程
注意勾選set up libaray later
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配置要吃透,前面有專門的記錄整理,很好一個程式運作跟蹤工具,對接日志之後,問題定位将更加友善。
回到首頁☞