Hibernate的基本映射$映射引用属性引用属性的意思是:持久化类的属性既不是基本数据类型,也不是String字符串,而是某个引用变量,该引用属性的类型可以是自定义类。先看 --> POJO public class Person implements Serialiazable ... { private int id; private int age; private Name name; person() ...{} public void setId(int id) ...{ this.id = id; } public int getId() ...{ return id; } public void setAge(int age) ...{ this.age = age; } public int getAge() ...{ return age; } public void setName(Name name) ...{ this.name = name; } public Name getName() ...{ return name; }} 接着看 --> 映射文件Person.hbm.xml <? xml version = " 1.0 " ?> <! DOCTYPE hibernate - mapping PUBLIC " -//Hibernate/Hibernate Mapping DTD 3.0//EN " " http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " > < hibernate - mapping package = " prolove " > < class name = " Person " table = " person " > < id name = " id " column = " person_id " > < generator class = " identity " /> </ id > < property name = " age " /> <!-- 映射引用属性name,引用属性的类型为Name --> < component name = " name " class = " Name " unique = " true " > <!-- 映射引用属性的first属性 --> < property name = " first " /> <!-- 映射引用属性的last属性 --> < property name = " last " /> </ componet > </ class > </ hibernate - mapping > 一、集合引用属性的映射 1 .POJO public class Person implements Serializabale ... { private int id; private String name; private int age; private List schools = new ArrayList(); Person() ...{} public void setSchools(List schools) ...{ this.schools = schools; } public List getSchools() ...{ return schools; } ……} 2 .school前面Person实例的schools属性里存放系列的字符串,而现在的schools属性里存放系列的School实例。 public class School implements Serialiazable ... { //School类的两个属性:name和address private String name; private String address; public School() ...{} public School(String s1, String s2) ...{ this.name = s1; this.address = s2; } public void setAddress(String address) ...{ this.address = address; } public String getAddress() ...{ return address; } ……} 3 .Person.hbm.xml <? xml version = " 1.0 " ?> <! DOCTYPE hibernate - mapping PUBLIC " -//Hibernate/Hibernate Mapping DTD 3.0//EN " " http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " > < hibernate - mapping package = " prolove " > < class name = " Person " > < id name = " id " column = " personid " > < generator class = " identity " /> </ id > < property name = " name " /> < property name = " age " /> <!-- 映射List集合属性 --> < list name = " schools " table = " school " > <!-- 映射关联外键列 --> < key column = " personid " not - null = " true " /> <!-- List有序集合,需要索引列 --> < list - index column = " list_order " /> <!-- composite - element映射集合里的元素,class属性确定集合里元素的类型 --> < composite - element class = " school " > <!-- 每个property属性映射集合元素的基本属性 --> < property name = " name " /> < property name = " address " /> </ composite - element > </ list > </ class > </ hibernate - mapping > 二、引用类型主键的映射 1 .POJO public class Person ... { //用作持久化类Person的标识属性 private Name name; //普通属性age private int age; Person() ...{} ……} 2 .如果持久化类需要使用引用类型作为表示属性时,则该类应满足以下两个条件: * 实现java.io.Serializabale接口 * 重写equals()和hashCode()方法,这两个方法的返回值都应该根据数据表中联合主键的列来判断 // 标识属性类,实现Serializable接口 public class Name implements Serializable ... { private String firstName; private String lastName; public Name() ...{} …… //重写hashCode()方法,该方法根据firstName和lastName的值计算得到 public int hashCode() ...{ return firstName.hashCode() + lastName.hashCode(); } //重写equals方法,同样也根据firstName和lastName两个属性来判断 public boolean equals(Object o) ...{ if (o instanceof Name) ...{ Name p = (Name)o; if (p.getFirstName().equals(firstName) && p.getLastName().equals(lastName)) ...{ return true; } else ...{ return false; } } else ...{ return false; } }} 3 .POJO Person持久化映射文件: <? xml version = " 1.0 " ?> <! DOCTYPE hibernate - mapping PUBLIC " -//Hibernate/Hibernate Mapping DTD 3.0//EN " " http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " > < hibernate - mapping package = " prolove " > < class name = " Person " table = " person " > <!-- composite - id元素用于映射引用类型的标识属性,其中class元素确定属性的类型 --> < composite - id name = " name " class = " Name " > <!-- key - property元素确定标识属性类包含的属性 --> < key - property name = " firstName " /> < key - property name = " lastName " /> </ composite - id > < property name = " age " /> </ class > </ hibernate - mapping > ==> 建议尽量不要使用这种复杂的标识属性。关于联合主键的映射还有一种策略,直接将多个属性映射成数据库主键三、复合主键的映射改写上面的持久化类Person,不使用name作为Person的标识属性,而是直接使用firstName和lastName作为标识属性 映射复合主键的持久化类必须满足以下2个条件: * 实现java.io.Serializabale接口 * 重写equals()和hashCode()方法,两个方法的返回值都应该根据数据表中联合主键的列来判断 1 .POJO Person public class Person implements Serializable ... { //直接定义lastName和firstName两个属性 private String lastName; private String firstName; private int age; Person() ...{} ……省略setter&getter public boolean equals(Object o) ...{ if (o instanceof Person) ...{ Person p = (Person)o; if (p.getFirstName().equals(firstName) && p.getLastName().equals(lastName)) ...{ return true; } else ...{ return false; } } else ...{ return false; } } public int hashCode() ...{ int hashCode = firstName.hashCode() + lastName.hashCode(); return hashCode; }} 2 .Mapping <? xml version = " 1.0 " ?> <! DOCTYPE hibernate - mapping PUBLIC " -//Hibernate/Hibernate Mapping DTD 3.0//EN " " http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " > < hibernate - mapping package = " prolove " > < class name = " Person " table = " personcomid " > <!-- composite - id元素用于映射复合主键 --> < composite - id > <!-- key - property元素映射复合主键的每个元素 --> < key - property name = " firstName " /> < key - property name = " lastName " /> </ composite - id > < property name = " age " /> </ class > </ hibernate - mapping >