<id name="id" type="long" > <generator class="identity"/> </id>其中class有多种类型 但实际上我们只需记得四种
native 自动选择数据库
identity 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。
sequence 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
uuid: 使用一个128bit的字符串来标识主键
通过简单的比较 相信大家都明白如果是数字型的主键就选择native 它会设置为对应数据库的自增形式
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long getId() { ... }其中strategy可以有以下四种形式
通过上面四句话 相信大家都知道 该使用那种了吧
package com.bjsxt.hibernate; public class Student { private StudentPK pk; private int age; private String sex; //省略get/set方法 }
package com.bjsxt.hibernate; public class StudentPK implements java.io.Serializable{ private int id; private String name; @Override public boolean equals(Object o) { if(o instanceof StudentPK) { StudentPK pk = (StudentPK)o; if(this.id == pk.getId() && this.name.equals(pk.getName())) { return true; } } return false; } @Override public int hashCode() { return this.name.hashCode(); } }每一个学生是以StudentPk作为主键 同时得记住主健类得复写equals和hashcode方法 同时实现serializable接口
<class name="com.bjsxt.hibernate.Student"> <composite-id name="pk" class="com.bjsxt.hibernate.StudentPK"> <key-property name="id"></key-property> <key-property name="name"></key-property> </composite-id> <property name="age" /> <property name="sex" /> <property name="good" type="yes_no"></property> </class>我想我依然不用说太多了
如上例中 在studentpk类上@embeddable
在student中的getpkStudent方法上@id
在上例中只用在student中的getPKStudent()方法上加上@embeddedid
如上例中在student类上加上
@IdClass(StudentPK.class)
在student类中getid和getname两个方法上都加上@id