hibernate annotation 之 註解聲明 – JAVA編程語言程序開發技術文章

@Entity

     將一個 POJO 類註解成一個實體 bean ( 持久化 POJO 類 )

@Table

    為實體 bean 映射指定具體的表,如果該註解沒有被聲明,系統將使用默認值 ( 即實體 bean 不帶包名的短類名 )

@Id

    將實體bean中的某個屬性定義為標識符 ( identifier )

@GeneratedValue

    該註解可以定義該標識符的生成策略 ( 默認是 AUTO 策略 ) :

    AUTO — 可以是 IDENTITY,或 SEQUENCE 或 TABLE 類型,這取決於不同的底層數據庫。

    TABLE — 使用表保存id值

    IDENTITY — 自然遞增

    SEQUENCE — 序列

@Transient

     被註解成 @Transient 的 getter 方法或屬性,將不會被持久化,hibernate 會忽略這些字段和屬性。

@Basic

    所有沒有定義註解的屬性,等價於在其上面添加瞭 @Basic 註解.。通過 @Basic註解可以聲明屬性的獲取策略 ( fetch strategy )

@Temporal

    在核心的 Java API 中並沒有定義時間精度 ( temporal precision )。因此處理時間類型數據時,你還需要定義將其存儲在數據庫中所預期的精度。

    在數據庫中,表示時間類型的數據有 DATE,TIME,和 TIMESTAMP 三種精度 ( 即單純的日期,時間,或者兩者兼備 )。 可使用 @Temporal 註解來調整精度。

@Column

    將實體 bean 中的屬性映射到表中的列。

    @Column(

        name = "columnName";                                (1)

        boolean unique() default false;                  (2)

        boolean nullable() default true;                (3)

        boolean insertable() default true;            (4)

        boolean updatable() default true;            (5)

        String columnDefinition() default "";       (6)

        String table() default "";                                (7)

        int length() default 255;                               (8)

        int precision() default 0;                              (9)

        int scale() default 0;                                      (10)

(1)     name 可選,列名(默認值是屬性名)

(2)     unique 可選,是否在該列上設置唯一約束(默認值false)

(3)     nullable 可選,是否設置該列的值可以為空(默認值true)

(4)     insertable 可選,該列是否作為生成的insert語句中的一個列(默認值true)

(5)     updatable 可選,該列是否作為生成的update語句中的一個列(默認值true)

(6)     columnDefinition 可選,為這個特定列覆蓋SQL DDL片段 (這可能導致無法在不同數據庫間移植)

(7)     table 可選,定義對應的表(默認為主表)

(8)     length 可選,列長度(默認值255)

(9)     precision 可選,列十進制精度(decimal precision)(默認值0)

(10)  scale 可選,如果列十進制數值范圍(decimal scale)可用,在此設置(默認值0)

環境 : JDK 1.6,eclipse 3.6,maven 3.0.4,hibernate 3.3.2,junit 4.7,mysql 5.1

 pom.xml 清單
 
<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/maven-v4_0_0.xsd">

 <modelVersion>4.0.0</modelVersion>

 <groupId>com.fancy</groupId>

 <artifactId>hibernate_annotation</artifactId>

 <packaging>war</packaging>

 <version>1.0</version>

 <name>hibernate_annotation Maven Webapp</name>

 <url>http://maven.apache.org</url>

 

 <dependencies>

 

   <!– Hibernate framework –>

    <dependency>

      <groupId>org.hibernate</groupId>

      <artifactId>hibernate-core</artifactId>

      <version>3.3.2.GA</version>

    </dependency>

    <!– Hibernate Dependency Start –>

    <dependency>

      <groupId>cglib</groupId>

      <artifactId>cglib</artifactId>

      <version>2.2</version>

    </dependency>

    <dependency>   

      <groupId>javassist</groupId>   

      <artifactId>javassist</artifactId>   

      <version>3.9.0.GA</version>

    </dependency>

    <dependency>

      <groupId>org.hibernate</groupId>

      <artifactId>hibernate-annotations</artifactId>

      <version>3.4.0.GA</version>

    </dependency>

    <dependency>   

      <groupId>org.slf4j</groupId>   

      <artifactId>slf4j-log4j12</artifactId>   

      <version>1.5.8</version>

    </dependency>

    <!– Hibernate Dependency End –>

 

    <!– mysql driver –>

    <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId>

      <version>5.1.17</version>

    </dependency>

    <!– junit –>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.7</version>

      <scope>test</scope>

    </dependency>

 

 </dependencies>

 

 <build>

    <finalName>hibernate_annotation</finalName>

 </build>

 

</project>

 

註 : 此處配置 pom.xml 是使用 maven 來管理 jar 包,如果你沒有使用 maven,則需手動導入相關 jar 包。

  實體 bean
 
package net.yeah.fancydeepin.po;

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 javax.persistence.Transient;

import java.io.Serializable;

/**

 * —————————————–

 * @描述 實體類

 * @作者 fancy

 * @郵箱 fancydeepin@yeah.net

 * @日期 2012-10-12 <p>

 * —————————————–

 */

@Entity

@Table(name = "user")

public class User implements Serializable {

         private static final long serialVersionUID = 1L;

   /**

    * ID,主鍵

    */

   private Integer id;

   /**

    * 用戶名

    */

   private String name;

   /**

    * 昵稱

    */

   private String nickName;

   /**

    * 郵箱地址

    */

   private String email;

   /**

    * 註冊日期時間

    */

   private Date   registerDate;

   /**

    * 最近登錄時間

    */

   private Date   recentLoginTime;

   /**

    * 上一次登錄時間

    */

   private Date   lastLoginDay;

 

   @Id

   @GeneratedValue

   public Integer getId() {

      return id;

   }

   @Column(length = 18, nullable = false)

   public String getName() {

      return name;

   }

   @Transient

   public String getNickName() {

      return nickName;

   }

   @Column(name = "mail", length = 40, nullable = false)

   public String getEmail() {

      return email;

   }

   @Temporal(TemporalType.TIMESTAMP)

   @Column(nullable = false)

   public Date getRegisterDate() {

      return registerDate;

   }

   @Temporal(TemporalType.TIME)

   public Date getRecentLoginTime() {

      return recentLoginTime;

   }

   @Temporal(TemporalType.DATE)

   public Date getLastLoginDay() {

      return lastLoginDay;

   }

   public void setId(Integer id) {

      this.id = id;

   }

   public void setName(String name) {

      this.name = name;

   }

   public void setNickName(String nickName) {

      this.nickName = nickName;

   }

   public void setEmail(String email) {

      this.email = email;

   }

   public void setRegisterDate(Date registerDate) {

      this.registerDate = registerDate;

   }

   public void setRecentLoginTime(Date recentLoginTime) {

      this.recentLoginTime = recentLoginTime;

   }

   public void setLastLoginDay(Date lastLoginDay) {

      this.lastLoginDay = lastLoginDay;

   }

}

 

註 : 註解可以是在屬性或 getter 方法上進行聲明,但不建議混合使用這兩種聲明方式,相反,應該盡量避免。另外,由 static 修飾的屬性不會被持久化到數據庫。

 hibernate.cfg.xml 清單
 
<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/temp</property>

        <property name="connection.username">username</property>

        <property name="connection.password">password</property>

        <!– SQL dialect –>

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

        <!– Enable Hibernate's automatic session context management –>

        <property name="current_session_context_class">thread</property>

 

        <!– Echo all executed SQL to stdout –>

        <property name="show_sql">true</property>

        <property name="format_sql">true</property>

        <mapping class="net.yeah.fancydeepin.po.User"/>

    </session-factory>

</hibernate-configuration>
 

 

 Junit Test 
 
package junit.test;

import java.util.Date;

import net.yeah.fancydeepin.po.User;

import org.hibernate.Session;

import org.hibernate.cfg.AnnotationConfiguration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

import org.junit.BeforeClass;

import org.junit.Test;

/**

 * —————————————–

 * @描述 Junit Test

 * @作者 fancy

 * @郵箱 fancydeepin@yeah.net

 * @日期 2012-10-12 <p>

 * —————————————–

 */

public class TestApp {

   private static Session session = null;

 

   @BeforeClass

   public static void beforeClass() throws Exception {

 

      session = new AnnotationConfiguration().configure().buildSessionFactory().getCurrentSession();

   }

   @Test

   public void createTable(){

      new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);

   }

   @Test

   public void insert(){

      User user = new User();

      Date date = new Date();

      user.setName("fancy");

      user.setEmail("fancydeepin@yeah.net");

      user.setRegisterDate(date);

      user.setRecentLoginTime(date);

      user.setLastLoginDay(date);

      session.beginTransaction();

      session.save(user);

      session.getTransaction().commit();

   }

}
 

 

在 Junit 測試類中執行建表方法 createTable,後臺打印輸出的 SQL 語句 :

drop table if exists user

create table user (

    id integer not null auto_increment,

    name varchar(18) not null,

    mail varchar(40) not null,

    registerDate datetime not null,

    recentLoginTime time,

    lastLoginDay date,

    primary key (id)

)

 

數據庫中生成的表結構 :

 

在 Junit 測試類中執行插入數據的方法 insert,後臺打印輸出的 SQL 語句 :

Hibernate:
    insert
    into
        user
        (mail, lastLoginDay, name, recentLoginTime, registerDate)
    values
        (?, ?, ?, ?, ?)

數據庫中的數據 :


 

發佈留言