@Transient
public String getTitle() {
return title;
}
TemporalType.TIME:表示HH:mm:ss
使用@Enumerated(value=EnumType)来注解表示此成员属性为枚举映射到数据库
其中EnumType有二个值:
①EnumType.STRING 表示直接将枚举名称存入数据库
②EnumType.ORDINAL 表示将枚举所对应的数值存入数据库
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* Hibernate工具<br/>
* 将对象模型生成关系模型(将对象生成数据库中的表)
* 把hbm映射文件(或Annotation注解)转换成DDL
* 生成数据表之前要求已经存在数据库
* 注:这个工具类建立好后,以后就不用建立了。以后直接Copy来用。
* @author wjt276
* @version 1.0 2009/10/16
*/
public classExportDB {
public static voidmain(String[] args){
/*org.hibernate.cfg.Configuration类的作用:
*读取hibernate配置文件(hibernate.cfg.xml或hiberante.properties)的.
*new Configuration()默认是读取hibernate.properties
*所以使用newConfiguration().configure();来读取hibernate.cfg.xml配置文件
*/
Configuration cfg = new AnnotationConfiguration().configure();
/*org.hibernate.tool.hbm2ddl.SchemaExport工具类:
*需要传入Configuration参数
*此工具类可以将类导出生成数据库表
*/
SchemaExport export = newSchemaExport(cfg);
/** 开始导出
*第一个参数:script是否打印DDL信息
*第二个参数:export是否导出到数据库中生成表
*/
export.create(true, true);
}}
与 Hibernate 和 程序员无关。
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "identity" )
@GeneratedValue ( generator = "idGenerator" )
并由数据库来维护这个 sequence 序列。
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "sequence" ,
parameters = { @Parameter ( name = "sequence" , value = "seq_name" )})
@GeneratedValue ( generator = "idGenerator" )
注意 : 该策略要求设定序列名,否则 hibernate 将无法找到,这将引致抛出异常 :
org.hibernate.exception.SQLGrammarException: could not get next sequence value
2.2 方法二
@Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
public class Teacher {
private int id;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
public int getId() {
return id;
}}
注意:此生成策略不支持MySQL(因为mysql不支持sequence)
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "native" )
@GeneratedValue ( generator = "idGenerator" )
主键计数器是由 hibernate 的一个实例来维护,每次自增量为 1,但在集群下不能使用该策略,
否则将引起主键冲突的情况,该策略适用于所有关系型数据库使用。
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "increment" )
@GeneratedValue ( generator = "idGenerator" )
uuid 最终被编码成一个32位16进制数的字符串,
占用的存储空间较大。用于为 String 类型生成唯一标识,适用于所有关系型数据库。
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "uuid" )
@GeneratedValue ( generator = "idGenerator" )
如果该数据没有被分配主键ID值或分配的值存在重复,则该数据都将无法被持久化且会引起异常的抛出。
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "assigned" )
@GeneratedValue ( generator = "idGenerator" )
@javax.persistence.TableGenerator(
name="Teacher_GEN", //生成策略的名称
table="GENERATOR_TABLE", //在数据库生成表的名称
pkColumnName = "pk_key", //表中第一个字段的字段名 类型为varchar,key
valueColumnName = "pk_value", //表中第二个字段的字段名 int ,value
pkColumnValue="teacher", //这个策略中使用该记录的第一个字段的值(key值)
initialValue = 1, //这个策略中使用该记录的第二个字段的值(value值)初始化值
allocationSize=1 //每次使用数据后累加的数值
)
这样执行后,手动数据库建立一个表,语句如下:
create table GENERATOR_TABLE (pk_key varchar(255),pk_value integer )
结构:
并且表建立好后,自动插入了一个记录,如下:
注:这条记录的pk_value值为2,是因为刚刚做例程序时,已经插入一条记录了。初始化时为
@Entity
@javax.persistence.TableGenerator(
name="Teacher_GEN", //生成策略的名称
table="GENERATOR_TABLE", //在数据库生成表的名称
pkColumnName = "pk_key", //表中第一个字段的字段名 类型为varchar,key
valueColumnName = "pk_value", //表中第二个字段的字段名 int ,value
pkColumnValue="teacher", //这个策略中使用该记录的第一个字段的值(key值)
initialValue = 1, //这个策略中使用该记录的第二个字段的值(value值)初始化值
allocationSize=1 //每次使用数据后累加的数值
)
public class Teacher {
private int id;
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
public int getId() {
return id;}}
注意:这样每次在添加Teacher记录时,都会先到GENERATOR_TABLE表取pk_key=teacher的记录后,使用pk_value值作为记录的主键。然后再给这个pk_value字段累加1,再存入到GENERATOR_TABLE表中,以便下次使用。
这个表可以给无数的表作为主键表,只是添加一条记录而以(需要保证table、pkColumnName、valueColumnName三个属性值一样就可以了。),这个主键生成策略可以跨数据库平台。