Entity是基于JPA规范。更详细的技术细节请参考JPA或Hibernate文档。
com.jspxcms.plug.ContextConfig
的@EntityScan({ "com.jspxcms.plug.domain" })
会自动扫描该包下含有@Entity
注解的类。
不使用主键自增策略,而是使用JPA的TABLE主键生成策略,将主键放到数据库中的一个表里,这个表在Hibernate里默认为Hibernate_sequences
。所以在建表的时候不要使用主键自增。
create table plug_resume
(
f_resume_id int not null,
f_site_id int not null,
f_name varchar(100) not null comment '姓名',
f_post varchar(100) not null comment '应聘职位',
f_creation_date datetime not null comment '投递日期',
f_gender char(1) not null default 'M' comment '性别',
f_birth_date datetime comment '出生日期',
f_mobile varchar(100) comment '手机',
f_email varchar(100) comment '邮箱',
f_expected_salary int comment '期望薪水',
f_education_experience longtext comment '教育经历',
f_work_experience longtext comment '工作经历',
f_remark longtext comment '备注',
primary key (f_resume_id)
)
engine = innodb;
alter table plug_resume comment '简历表';
alter table plug_resume add constraint fk_plug_resume_site foreign key (f_site_id)
references cms_site (f_site_id) on delete restrict on update restrict;
使用JPA的TABLE主键生成策略。
需注意以下三个值:name = "tg_plug_resume", pkColumnValue = "plug_resume" generator = "tg_plug_resume"
,其中plug_resume
为表名,如果表名为abc
,则这三个值分别为name = "tg_abc", pkColumnValue = "abc" generator = "tg_abc"
。
initialValue = 1
代表主键从1开始。allocationSize = 10
代表hibernate一次获取10个主键值,如果没有用完系统就重启了,那么在数据库中会出现主键不连续的情况。但由于获取主键值要查询并修改数据库,对于频繁插入数据的表来说,是一个很大的开销,所以可以根据情况适当调整这个值。
如果使用MySQL的主键自增,除了在表主键里增加主键自增属性,在Entity里的ID注解也要改为@GeneratedValue( generation = IDENTITY )
或@GeneratedValue( generation = AUTO )
。
package com.jspxcms.plug.domain;
@Entity
@Table(name = "plug_resume")
public class Resume implements java.io.Serializable {
private Integer id;
……
@Id
@Column(name = "f_resume_id", unique = true, nullable = false)
@TableGenerator(name = "tg_plug_resume", pkColumnValue = "plug_resume", initialValue = 1, allocationSize = 10)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "tg_plug_resume")
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
……
}