在这里回顾下hibernate对table的信息标注和如何自动生成primary key。
可以getxxx()函数前面,用@进行指明。
指明table 名字: @Table(name="EmployeeInfo")
指明column 名字: @Column(name="EmployeeId")
同时可以对column的属性进行设置
值非空: @Column(nullable=false)
存储日期变量: @Temporal(TemporalType.DATE)
存储日期和时间变量:@Temporal(TemporalType.TIMESTAMP)
代码:
package com.hibernate.chapter1;
import java.util.Calendar;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import java.util.Date;
@Entity
@Table(name="EmployeeInfo") //give table name
public class Employee {
private int empId;
private String empName;
private String empPassword;
private String empEmailAddress;
private boolean isPermanent;
private Calendar empJoinDate;
private Date empLoginTime;
@Id //mean primary key
@Column(name="EmployeeId") //give table column name
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
@Transient //do not save it into table as a column
public String getEmpPassword() {
return empPassword;
}
public void setEmpPassword(String empPassword) {
this.empPassword = empPassword;
}
@Column(nullable=false) // this column value can not be null
public String getEmpEmailAddress() {
return empEmailAddress;
}
public void setEmpEmailAddress(String empEmailAddress) {
this.empEmailAddress = empEmailAddress;
}
@Basic //same as default annotation
public boolean isPermanent() {
return isPermanent;
}
public void setPermanent(boolean isPermanent) {
this.isPermanent = isPermanent;
}
@Temporal(TemporalType.TIMESTAMP) //save Date and Time
public Date getEmpLoginTime() {
return empLoginTime;
}
public void setEmpLoginTime(Date empLoginTime) {
this.empLoginTime = empLoginTime;
}
@Temporal(TemporalType.DATE)
public Calendar getEmpJoinDate() {
return empJoinDate;
}
public void setEmpJoinDate(Calendar empJoinDate) {
this.empJoinDate = empJoinDate;
}
}
一般情况下,我们的primary key 不是自己指定的,可能需要有规律地生成,那么如何让hibernate自动生成primary key ?
可以通过@GenerateValue这种标注形式。
@Id //mean primary key
@GeneratedValue
@Column(name="EmployeeId") //give table column name
public int getEmpId() {
return empId;
}
但是,仅加这种标注,hibernate仅会帮你生成unique primary key,比如下图:
有时候,我们生成的primary key 希望是连续的,那该怎么做呢?
回忆,我们之前如果写原始代码保证id连续的时候,往往是选择从表中读取最大的id后,然后新的id从这种最大的id号开始增加。
hibernate的做法也是类似的。
我们可以指定auto primary key 的生成策略。(相当于把下个序列的信息存储起来)
@GeneratedValue(strategy=GenerationType.TABLE, generator="empIdGen")
@TableGenerator(name="empIdGen", table="emppkTable", pkColumnName="empKey",
pkColumnValue="empvalue", allocationSize=1)
我们用一个叫empkTable的表存储序列信息。pkColumnValue存储了下一个序列的primary key,allocationSize指明了间隔。
设置生成策略以后,我们的primary key就连续了。
这是emppkTable中的信息: