hibernate映射
hibernate映射
集合属性大致分为二种:
单纯的集合属性,像List,Set或数组等集合属性。
2,Map集合属性,每个属性值多有相对应的Key映射。
集合映射属性分为以下几种:
List:用于映射List集合属性,List是有序的,可重复的.
Set:用于映射Set集合属性,Set是无序的,不可重复.
Map:用于映射Map集合属性,具有键值对属性(Key ,value);
Array:用于映射数组集合属性.为有序可重复.
Bag:用于应映射无序集合属性,当我们用Bag作映射时,我们定义集合时,我们不应当使用具体的集合,而是用集合的父类接口:Collection.
相对几种集合的应用:
List:
由于他是有序的集合,因此用Hibernate持久化到数据库中时,"必须增加到例表示集合的顺序"~,集合属性只能以接口形式声明,因为当Hibernate持久化某个实例时, Hibernate会自动把集序中的集合实现类替换成Hibernate自己的实现类。代码 如下:
private int id;
private int age;
private String name;
private List<Person> schools;
那么我们如何来映射集合中的元素到数据库中呢?在hibernate的映射文件中,我们可以增加对<list></list>标签来完成,实际如下:
<list name="schools" table="school_table">//table是我们指定的把集合元素映射到哪个表中.
<key column="person_id"></key>//这里是指出主表的外键是哪个,这里我们用主键例来映射,一般开发也是这样做。(主表的外键可认为是子表的主键)
//主表与子表之间的关联就是通过外键来维持的,
<list-index column="school_indext"></list-index>//用来指定集合的序列,因为list集合是有序的,这也就是我们上面提到的要必须增加的一例
<element column="school" type="string" length="30"></element>//这个标签是把list里的元素一个一个放到column指定的例名下,type指定放入的类形 </list>
Array:数组的方式与List的完全一样,只要把标签改成<array></array>就可
Set:与List,Array一样,只是Set是无序的,在<set></set>里不用indext标签就可以了.
Bag:使用bag映射集合时,对于Set集合不好用,这是唯一的要点,对于List,Array,多没有问题。
同时,不管是哪种集合,使用bag映射之后多会变为无序的集合,而集合属性对应的表没有主键.
Map:Map不仅要映射属性值,还要映射属Key,也就是key,value多要映射。Hibername将会以外键和key例作为联合主键.
<map name="scores">
<key column="student_id"></key>
<map-key type="string" column="subject" length="10"></map-key>//必须指明类型,用于映射Map的key
<element type="int" column="score" length="3" not-null="true"></element>//也要指明类型,用来映射Map的value.
</map>
映射组件属性:
组件属性的意思是持久化类的属性不是基本数据类型,也不是String类型,而是某个组件的变量,该组件属性类型可以是自定义类型.
然后hibernate不能直接用property映射,为了映射组件属性,hibernate提供了component无系。每个component元素映射一个组件,组件属性必须指定该属性的类形.
Component元素中的class属性用于确定组类的类型.
组件的一个浅显例子,一个工人,他有月薪,年薪,带薪休候,这些是就可以做一个组件放到一起。组件是一个没有ID的类。
<component name="pay" column="month_pay"></property>
<property name="yearlPay" column="year_pay"></property>
<property name="vocationWithPay" column="vactionwith_pay"></property>
</component>
集合映射组件属性:
集合除了存放String 字符串以外,还可以存放组件类形,实际上更多情况下,集合组件存放的都是组件类型.这时我们就要用到composite-element子元
素来映射集合元素,刚时还要class来指定元素的类型.用property来指定组件类型的子属性.
<list name="jobHistories" table="job_table">
<key column="worker_id"></key>
<list-index column="job_index"></list-index>
<composite-element column="position_name"></property>
<property name="company" column="company_name"></property>
<property name="starting" column="`starting`" type="date"></property>
<property name="ending" column="`ending`" type="date"></property>
</composite-element>
</list>