之前我们对表进行修改,将表和java对象联系起来采用的是personPO.hbm.xml文件,由于过于麻烦我们采用注解的形式进行关联。
@Entity
@Table(name="t_person")
public class PersonPO {
private String pid;
private String name;
private Date birthday;
@Id
//整形自动编号
//@GeneratedValue()
//使用序列
//@GenericGenerator(strategy="sequence" ,name="seq_abcd")//oracle
//@GeneratedValue(strategy=GenerationType.IDENTITY)
//uuid
@GenericGenerator(name="person_uuid",strategy="uuid")
@GeneratedValue(generator="person_uuid")
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
// @column()//name length
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
public class PersonDAOTest {
public static void main(String args[])
{
//创建配置对象
Configuration cfg=new Configuration().configure("config/hibernate/cfg.xml");
//获取sessionFactory
SessionFactory sessionFactory=cfg.buildSessionFactory();
//创建会话
Session session=sessionFactory.openSession();
PersonPO person=new PersonPO();
// person.setPid(1);
person.setName("zhaomin");
person.setBirthday(new Date());
//添加事务
session.beginTransaction();
session.save(person); //增加
//session.update(person);//根据主键进行修改
// session.delete(person);//删除
session.getTransaction().commit();
// person=(PersonPO)session.get(PersonPO.class, 1);
// System.out.println(person.getName()); //查询
session.close();
}
}
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/testdata
root
123456
1
org.hibernate.dialect.MySQLDialect
org.hibernate.cache.NoCacheProvider
true
update
主键生成策略:
xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
GUID:Globally Unique Identifier全球唯一标识符,也称作 UUID,是一个128位长的数字,用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。
foreign使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。
select使用触发器生成主键,主要用于早期的数据库主键生成机制,能用到的地方非常少。
注解的属性:类别注解
属性注解
@Id 映射生成主键
@Version 定义乐观锁
@Column 映射表的列
@Transient 定义暂态属性
@Column - 可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中 该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具非常有作用。
属性:
name - 可选,表示数据库表中该字段的名称,默认情形属性名称一致
nullable -可选,表示该字段是否允许为 null,默认为true
unique - 可选,表示该字段是否是唯一标识,默认为 false
length - 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.
insertable -可选,表示在ORM框架执行插入操作时,该字段是否应出现INSETRT 语句中,默认为true
updateable -可选,表示在ORM 框架执行更新操作时,该字段是否应该出现在 UPDATE语句中,默认为 true. 对于一经创建就不可以更改的字段,该 属性非常有用,如对于 birthday字段。
columnDefinition - 可选,表示该字段在数据库中的实际类型。通常ORM框架可以根 据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据 库中字段类型究竟是 DATE,TIME还是TIMESTAMP. 此外 ,String 的默认映射类型为VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB或TEXT字段类型,该属性非常有用。
示例 :
@Column(name="BIRTH",nullable="false",columnDefinition="DATE")
public String getBithday() {
return birthday;
}
@Id - 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主 键,置于 getXxxx() 前。
@GeneratedValue(strategy=GenerationType,generator="") - 可选,用于定义主键生成策略。
属性:
Strategy - 表示主键生成策略,取值有:
GenerationType.AUTO - 根据底层数据库自动选择(默认),若数据库支持自动 增 长类型,则为自动增长。
GenerationType.INDENTITY - 根据数据库的Identity字段生成,支持DB2、MySQL、 MS、SQL Server、SyBase与HyperanoicSQL数据库的Identity 类型主键。
GenerationType.SEQUENCE - 使用Sequence来决定主键的取值,适合Oracle、DB2等 支持Sequence的数据库,一般结合@SequenceGenerator使用。
(Oracle没有自动增长类型,只能用Sequence)
GenerationType.TABLE - 使用指定表来决定主键取值,结合@TableGenerator使用。
如:
@Id
@TableGenerator(name="tab_cat_gen",allocationSize=1)
@GeneratedValue(Strategy=GenerationType.Table)
Generator - 表示主键生成器的名称,这个属性通常和ORM框架相关 , 例如:
Hibernate 可以指定 uuid 等主键生成方式
@SequenceGenerator — 注解声明了一个数据库序列。
属性:
name - 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中。
sequenceName - 表示生成策略用到的数据库序列名称。
initialValue - 表示主键初始值,默认为0.
allocationSize - 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.
示例 :
@Id
@GeneratedValues(strategy=StrategyType.SEQUENCE)
public int getPk() {
return pk;
}
Hibernate的访问类型为field时,在字段上进行注解声;
访问类型为property时,在getter方法上进行注释声明。