package com.foshanshop.ejb3.bean; import java.io.Serializable; 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.GenerationType; @SuppressWarnings("serial") @Entity @Table(name = "Person") /*@Entity 注释指明这是一 个实体Bean,@Table 注释指定了entity 所要映射的数据库表,其中@Table.name()用来指定映射表的表名。如果缺省@Table 注释,系统默认采用类名作为映射表的表名。实体Bean 的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。*/ public class Person implements Serializable{ /*实体bean 需要在网络上传送时必须实现Serializable 接口,否则将引发java.io.InvalidClassException例外。*/ private Integer personid; private String name; private boolean sex; private Short age; private Date birthday; /*@Id 注释指定personid 属性为表的主键,它可以有多种生成方式 在下面 @GeneratedValue 注释定义了标识字段的生成方式,本例personid 的值由 数据库自动生成。*/ @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getPersonid() { return personid; } public void setPersonid(Integer personid) { this.personid = personid; } @Column(nullable=false,length=32) public String getName() { return name; } public void setName(String name) { this.name = name; } /*@javax.persistence.Column 注释定义了将成员属性映射到关系表中的哪一列和该列的一些结构信息(如列名是否唯一,是否允许为空,是否允许更新等),他的属性介绍如下: ·name: 映射的列名。如:映射Person 表的PersonName 列,可以在name 属性的getName 方法上面加入 @Column(name = "PersonName"),如果不指定映射列名,容器将属性名称作为默认的映射列名。 ·unique: 是否唯一 ·nullable: 是否允许为空 ·length: 对于字符型列,length 属性指定列的最大字符长度 ·insertable: 是否允许插入 ·updatable: 是否允许更新 ·columnDefinition: 定义建表时创建此列的DDL ·secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。*/ @Column(nullable=false) public boolean getSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } @Column(nullable=false) public Short getAge() { return age; } public void setAge(Short age) { this.age = age; }@Temporal 注释用来指定java.util.Date 或java.util.Calendar 属性与数据库类型date,time 或timestamp 中的那一种
类型进行映射。他的定义如下:
package javax.persistence; public enum TemporalType { DATE, //代表date 类型 TIME, //代表时间类型 TIMESTAMP //代表时间戳类型 }在Jboss 中可以缺少@Temporal 注释 注释的默认值为:TIMESTAMP
@Temporal(value=TemporalType.DATE) public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }2、id 的生成策略
@Id 注释指定personid 属性为表的主键,它可以有多种生成方式:
·TABLE:容器指定用底层的数据表确保唯一。例子代码如下:
@TableGenerator(name="Person_GENERATOR",//为该生成方式取个名称 table="Person_IDGenerator",//生成ID的表 pkColumnName="PRIMARY_KEY_COLUMN",//主键列的名称 valueColumnName="VALUE_COLUMN",//存放生成ID值的列的名称 pkColumnValue="personid",//主键列的值(定位某条记录) allocationSize=1)//递增值 @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="Person_GENERATOR") public Integer getPersonid() { return personid; }
·SEQUENCE:使用数据库的SEQUENCE 列来保证唯一(Oralce 数据库通过序列来生成唯一ID),例子代码如下:
@SequenceGenerator(name="Person_SEQUENCE", //为该生成方式取个名称 sequenceName="Person_SEQ")//sequence的名称(如果不存在,会自动生成) public class Person implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Person_SEQ") public Integer getPersonid() { return personid; }·IDENTITY:使用数据库的INDENTIT 列来保证唯一(像mysql,sqlserver 数据库通过自增长来生成唯一ID)
·AUTO:由容器挑选一个合适的方式来保证唯一(由容器决定采用何种方式生成唯一主键,hibernate 会根据
数据库类型选择适合的生成方式,相反toplink 就不是很近人情)
·NONE:容器不负责主键的生成,由调用程序来完成。
@GeneratedValue 注释定义了标识字段的生成方式,本例personid 的值由MySQL 数据库自动生成。