资源描述
OID生成策略
hibernate使用OID唯一标示一个po对象
数据库使用主键唯一标示一个实体
hbm.xml:
id 指定OID(对象标识符)
generator 指定生成主键的主要方式
native 根据底层数据库对自动生成标识符的支持能力,
来选择主键生成方式 oracle 自动生成hibernate_sequence的序列
increment Hibernate生成,select max(STUDENTID) 作为主键 适合所有数据库
identity 由底层数据库(支持自动增长)生成,常用于sqlserver mysql
sequence 由数据库提供的序列生成,适合Oracle
Assigned 通过程序指定 不指定generator时的默认
uuid 使用全球唯一标示生成主键
常用配置:
<generator class="native" />
mysql:
<generator class="identity" />
oracle:
<generator class="sequence" >
<param name="sequence">SEQ_STUDENT</param>
</generator>
JPA使用 @GeneratedValue指定ID生成策略:
@Id
@Column(name="TEACHERID")
@GeneratedValue(strategy=GenerationType.AUTO)
//oracle 指定序列名称
@SequenceGenerator(name="seq_teacher",sequenceName="SEQ_TEACHER",allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_teacher")
//mysql:
@GeneratedValue(strategy=GenerationType.IDENTITY)
映射自然主键(不指定自动增长的主键)
hbm.xml
<generator class="assigned" />
JPA:
@GeneratedValue(strategy=GenerationType.AUTO)
映射自然复合主键
映射文件版本
/*==============================================================*/
/* Table: job 映射联合主键例子: 职位表 */
/*==============================================================*/
create table job(
jobNo number(5) not null,
jobName varchar2(20) not null,
jobDesc varchar2(50),
constraint PK_job primary key(jobNo,jobName) --指定复合主键
)
Pojo类
//复合主键类
/**
* 复合主键类要求:
* 1.implements java.io.Serializable
* 2.重写equals hashCode
*/
public class JobId implements java.io.Serializable {
private Integer jobNo;
private String jobName;
//重写equals hashCode
//equsls 判断两个对象相等条件为jobNo和jobName都相等
@Override
public boolean equals(Object other) {
if ((this == other)) return true;
if ((other == null)) return false;
if (!(other instanceof JobId)) return false;
JobId jobId = (JobId) other;
if(!jobNo.equals(jobId.getJobNo())) return false;
if(!jobName.equals(jobId.getJobName())) return false;
return true;
}
@Override
public int hashCode() {
int result ;
result =(jobNo == null ? 0 : jobNo.hashCode());
result = 37 * result+ (jobName == null ? 0 : jobName.hashCode());
return result;
}
}
Job类
public class Job {
private JobId id; //联合主键类作为成员
private String jobdesc;
}
Job.hbm.xml映射文件
<hibernate-mapping package="org.px.ch4.dao.po">
<class name="Job" table="JOB" >
<!-- composite-id 指定复合主键类 -->
<composite-id name="id" class="JobId">
<key-property name="jobNo" type="java.lang.Integer" >
<column name="JOBNO" precision="2" scale="0" />
</key-property>
<key-property name="jobName" type="java.lang.String">
<column name="JOBNAME" length="20" />
</key-property>
</composite-id>
<property name="jobdesc" type="java.lang.String">
<column name="JOBDESC" length="50" />
</property>
</class>
</hibernate-mapping>
测试例子参见: JobDAOImpl.java JobDAOTest.java
Annotation联合主键版本
1. 使用@EmbeddedId注解标示联合主键类成员
@Entity
public class Job {
private static final long serialVersionUID = -4660865172058580473L;
private JobId id; //联合主键类作为成员 并且联合主键类的属性可以使用@Column
private String jobdesc;
@EmbeddedId
public JobId getId() {
return this.id;
}
}
2. 类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id.
@Entity
@IdClass(JobId.class)
public class Job {
private static final long serialVersionUID = -4660865172058580473L;
private String jobdesc;
private Integer jobNo;
private String jobName;
@Id
public Integer getJobNo() {
return jobNo;
}
@Id
public String getJobName() {
return jobName;
}
}
SchemaExport
hiberante的生成数据库表(及其他ddl)的工具类
可以通过这个工具类完成一些ddl
public static void main(String[] args) {
Configuration config=new Configuration();
config.configure("hibernate.cfg.xml");
SchemaExport export=new SchemaExport(config);
export.create(true, true); //参数1 是否在控制台输出语句 参数2 是否执行ddl
}
展开阅读全文