借用官方的demo稍加改編進行分析,java
1.pom.xml配置參考http://my.oschina.net/u/555061/blog/506049 mysql
2.hibernate.cfg.xml配置實體關係表,spring
<?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> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://192.168.191.1:3306/mysql</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> <!-- 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> <!-- Names the annotated entity class --> <mapping class="org.hibernate.tutorial.annotations.Event"/> </session-factory> </hibernate-configuration>
跟連接提到的配置都同樣,除了mapping這裏,sql
由原來的<mapping resource="UserModel.hbm.xml"/>--配置映射數據庫
改成如今的<mapping class="org.hibernate.tutorial.annotations.Event"/>--類(註解)映射session
3.看下這個實體Entity如何應用註解替代了配置映射app
package org.hibernate.tutorial.annotations; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "EVENTS") public class Event { @Id @GeneratedValue(generator = "increment") @GenericGenerator(name = "increment", strategy = "increment") @Column(name="EVENT_ID") private Long id; private String title; @Temporal(TemporalType.TIMESTAMP) @Column(name = "EVENT_DATE") private Date date; private int times; private boolean isSerious; public Event() { // this form used by Hibernate } public Event(String title, Date date, int times, boolean isSerious) { // for application use, to create new events this.title = title; this.date = date; this.times = times; this.isSerious = isSerious; } getters和setters省略。。。 }
解釋下,ide
3.1表頭的註解測試
這裏@Entity固定寫法,@Table是映射數據庫表,表名爲EVENTSui
3.2主鍵的註解
@Id標識id屬性爲主鍵
@GeneratedValue(generator = "increment")和@GenericGenerator(name = "increment", strategy = "increment")是主鍵自增配置,等效於xml那裏的native/increment
@Column(name="EVENT_ID")這裏的id映射數據庫裏的EVENT_ID字段,不過如今本人以爲仍是統一數據庫字段名稱和object的屬性名一致要好,也就是這裏寫成@Column(name="ID"),或者不寫@Column註解,它會自動同步屬性爲數據庫表字段,以避免之後出現不匹配的問題
3.3特殊類型的註解(Date類型)
這裏解釋下,主要是Date這種類型比較特別,因此須要@Temporal(TemporalType.TIMESTAMP)來特別註解,像String/int/boolean都不須要特別註解
能夠看到TemporalType一共有3種類型可選:DATE/TIME/TIMESTAMP
3.4hibernate處理boolean的原理
從生成的sql語句能夠看到hibernate處理boolean類型是用的tinyint類型
CREATE TABLE `events` ( `EVENT_ID` bigint(20) NOT NULL, `EVENT_DATE` datetime DEFAULT NULL, `isSerious` tinyint(1) NOT NULL, `times` int(11) NOT NULL, `title` varchar(255) DEFAULT NULL, PRIMARY KEY (`EVENT_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.測試,跟xml映射配置沒區別,註解和xml映射配置功效都是同樣的,相似於spring
public void testBasicUsage() { // create a couple of events... Session session = sessionFactory.openSession(); session.beginTransaction(); session.save( new Event( "Our very first event!", new Date(), 3, false ) ); session.save( new Event( "A follow up event", new Date(), 5, true ) ); session.save( new HibernateEmployee( "uuid", 123, "ayu", true ) ); session.getTransaction().commit(); session.close(); // now lets pull events from the database and list them session = sessionFactory.openSession(); session.beginTransaction(); List<Event> result = session.createQuery( "from Event" ).list(); for ( Event event : result ) { System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() ); System.out.println( "info : " + event.getTimes() + "|" + event.isSerious() ); } session.getTransaction().commit(); session.close(); }
這裏from Event是用的hqsql語法,打印結果以下,