hibernate4使用註解

借用官方的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語法,打印結果以下,

相關文章
相關標籤/搜索