映射组件属性
映射组件属性定义
组件属性,看到组件,你肯定就会想到是由一系列东西组成的东西,才可以称之为组件吧。
组件属性的意思是: 持久化类的属性并不是基本数据类型,也不是字符串、 日期等标量类型的变量,而是一个复合类型的对象, 在持久化的过程中,它仅仅被当做值类型, 而并非引用另一个持久化实体。
为了映射组件属性,Hibermate提供了<component…>元素,每个<component…>元素映射一一个组件属性。使用<component…>元素映射组件属性时需要指定-一个name属性,用于指定该组件属性的名称。除此之外,使用<component…/> 元素还需要如下几个可选属性。
- class: 指定组件类的类名。如果不指定该属性,Hibernate将通过反射来得到该组件的类型。
- insert:指定被映射的字段是否出现在SQL的insert语句中。
- update:指定被映射的字段是否出现在SQL的update语句中。
- access : 指定Hibernate访问该组件属性的访问策略,默认是property。
- lazy: 设置该组件是否在持久化对象第–次被访问时启用延迟加载,该属性默认是true。
- optimistic-ock: 设置更新该组件属性是否需要获取乐观锁,如果该属性设置为true,则当修改该组件属性时,持久化对象的版本号会增加。
- unique:指定是否在该组件映射的所有字段上添加唯一性约束。(对应到数据库,就是创建了一个索引)
一个 自定义类通常还包括其他属性,因此还应该为<componen…/>兀素增加<property…>子兀素来映射组件属性的子属性。此处的<property…> 子元素与<las…/元素里<property…>子元素的用法完全相似,因此当组件类型的属性是基本数据类型、String 类型、 日期类型时,使用<property…/> 元索进行映射。
使用注意
<component…/>: 如果该组件属性里的属性不是基本类型、String 类型、日期类型等, 而是另一个组件类型时,则在<componet…/> 里再次使用<component…>子元素进行映射。
集合映射元素:如果组件类型里的属性是数组类型、集合类型等,则可以在<componet…/>里使用<se…/>、<lis…/>. <map…/>等子元素来映射这些集合属性。
关联映射元素: 如果组件属性里的属性是另外一个持久化实例的引用,还可以在<component…/>里使用<many-to-one…/>、<one-to-one…/>等 子元素,这就变成Hibernate关联映射。
对于组件属性,Hibernate 组件里的每一个属性添加一个数据列即可。
使用例子
public class Person {
private Integer id;
private Integer age;
private Name name;
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class Name {
private String first;
private String last;
private Person p;// 引用该name的Person 对象
public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
}
<component name="name" class="Name" unique="true" ><!-- name是对应POJO 的属性名 ,class是指定的组件的POJO类-->
<parent n