Hibernate使用<id/>元素来映射主键。
<id name="" type="" column="" access="" unsaved-value="" length="" node=""> <generator class=""/> </id>
name:属性的名字
type:属性的类型,既可以是java数据类型,也可以是Hibernate内置数据类型
column:属性映射的数据表的字段名
access:属性的访问策略
unsaved-value:对Hibernate3来说基本上是不必要的
length:指定对应字段的长度
node:暂时不清楚
1、主键为基本数据类型及其包装类型、String类型、Date类型
<!--主键为Integer类型--> <id name="id" type="java.lang.Integer" column="id"> <generator class="identity"/> </id> <!--主键为String类型--> <id name="strId" type="java.lang.String" column="str_id"> <generator class="assigned" /> </id> <!--主键为Date类型--> <id name="dateId" type="java.util.Date" column="date_id"> <generator class="assigned" /> </id>
2、主键为自定义数据类型
//必须实现Serializable接口,否则Hibernate会抛出异常。 public class Name implements Serializable { private String firstName; private String lastName; //...... }
public class Person { private Name name; public Name getName() { return name; } public void setName(Name name) { this.name = name; } }
<composite-id name="name" class="org.lgy.hibernate.pojos.Name"> <key-property name="firstName" type="string" column="first_name" length="100"/> <key-property name="lastName" type="string" column="last_name" length="100"/> <generator class="assigned"/> </composite-id>
3、多列作为联合主键
//虽然主键没有实现类,但是Hibernate要求Person必须实现Serializable接口,否则抛出异常 public class Person implements Serializable { private String firstName; private String lastName; //... ... }
<!-- 因为不是一个真实的属性,所以<composite-id/>元素不需要name属性。 因为标识属性没有实现类,所以<composite-id/>元素不需要class属性。 --> <composite-id> <key-property name="firstName" type="string" column="first_name" length="100"/> <key-property name="lastName" type="string" column="last_name" length="100"/> </composite-id>