hibernate annotation 之 注解声明
2014-08-15 16:23
375 查看
@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.apa
4000
che.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 语句 :
将一个 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.apa
4000
che.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 语句 :
相关文章推荐
- hibernate annotation 之 注解声明
- 声明属性Hibernate的Annotation注解
- Hibernate Annotation (Hibernate 注解)
- Hibernate使用JPA注解声明一个PO类
- hibernate用注解(annotation)配置sequence
- hibernate的注解为何要在属性的get方法上声明
- hibernate中注解Annotation总结大全
- Spring2.5.6+Struts2+Hibernate3.6.7+DWR3.0 注解(Annotation)式配置
- Hibernate的Annotation中实体BLOB、CLOB类型的注解
- Hibernate的Annotation注解
- hibernate annotation注解方式来处理映射关系
- Hibernate的Annotation注解
- Hibernate Annotation (Hibernate 注解)
- hibernate annotation注解方式来处理映射关系
- 【Hibernate框架开发之四】Hibernate-Annotation常用的注解归总&&ID的生成策略&&联合主键
- hibernate annotation 注解
- hibernate annotation 双向 one-to-one 注解
- Hibernate Annotation (Hibernate 注解)
- Rhythmk 学习 Hibernate 07 - Hibernate annotation 实体注解
- hibernate annotation 双向 one-to-one 注解