@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 包。 实体 beanpackage 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 (?, ?, ?, ?, ?) 数据库中的数据 :