集合属性大致有两种:第一种是单纯的集合属性,如像 List、Set 或数组等集合属性;另一种是Map结构的集合属性,每个属性值都有对应的Key映射。
集合映射的元素大致有如下几种:
List: 用于映射 List 集合属性
Set: 用于映射 Set 集合属性
Map: 用于映射 Map 集合性
Array: 用于映射数组集合属性
Bag: 用于映射无序集合
idbag: 用于映射无序集合,但为集合增加逻辑次序
List方式:要求在映射文件中配置List时加一个标示顺序列,此列给hibernate用来记录数据的插入顺序
1. List 集合属性
List是有序集合,因此持久化到数据库时也必须增加一列来表示集合元素的次序。看下面的持久化类,该 News 类有个集合属性:schools ,该属性对应学校。而集合属性只能以接口声明,因此下面代码中,schools 的类型能是List ,不能是ArrayList ,但该集合属性必须使用实现类完成初始化。
此时的映射文件:
这时访问可以使用list
2使用bag作为映射格式
此时访问必须使用list,不能使用Set
3·使用Map
使用Map:
因为Map要使用键值对,所以要提供键,<map-key type=”string” column=”name”/>
注意:
1) type=”string”,不能写成type=”String” !!!!
2) column=”name”,指使用dempatment对象的name值作为key,如果你写成别的,比如:name1,表结构就会加上此列
总结:
集合性能的分析
对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是当系统需要使用集合属性时才从数据库装载关联的数据。 Hibernate 对集合属性默认采用延迟加载,在某些特殊的情况下为 set,,list,map 等元素设置lazy="false" 属性来取消延迟加载。
可将集合分成如下两类:
有序集合:集合里的元素 可以根据 Key 或 Index 访问
无序集合:集合里的元素中能遍历
有序集合的属性有增加、删除及修改中拥有较好的性能表现。在设计较好的 Hiberate domain Object 中,集合属性通常都会增加 inverse="true" 的属性,此时集合端不再控制关联关系。映射 Set 集合属性时,如果 element 元素包括 not-null="true" 属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键,但 List 集合属性的表总是以外键和元素次序列作为联合主键。
集合映射的元素大致有如下几种:
List: 用于映射 List 集合属性
Set: 用于映射 Set 集合属性
Map: 用于映射 Map 集合性
Array: 用于映射数组集合属性
Bag: 用于映射无序集合
idbag: 用于映射无序集合,但为集合增加逻辑次序
List方式:要求在映射文件中配置List时加一个标示顺序列,此列给hibernate用来记录数据的插入顺序
1. List 集合属性
List是有序集合,因此持久化到数据库时也必须增加一列来表示集合元素的次序。看下面的持久化类,该 News 类有个集合属性:schools ,该属性对应学校。而集合属性只能以接口声明,因此下面代码中,schools 的类型能是List ,不能是ArrayList ,但该集合属性必须使用实现类完成初始化。
import java.util.List;
public class Department {
private Integer id;
private String name;
private List<User1> users;
public List<User1> getUsers() {
return users;
}
public void setUsers(List<User1> users) {
this.users = users;
}
public Department(){}
public Department(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
此时的映射文件:
<?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="cn.itcast.hibernate.domain">
<class name="Department" table="Department">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<property name="name"/>
<list name="users" inverse="false">
<key column="deptid"/>
<list-index column="listindex"/>
<one-to-many class="User1"/>
</list>
</class>
</hibernate-mapping>
这时访问可以使用list
Department department2 = (Department)session.get(Department.class, 1);
List<User1> userList = department2.getUsers();
for(User1 user1 : userList){
System.out.println(user1.getName());
}
2使用bag作为映射格式
<?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="cn.itcast.hibernate.domain">
<class name="Department" table="Department">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<property name="name"/>
<bag name="users">
<key column="deptid"/>
<one-to-many class="User1"/>
</bag>
</class>
</hibernate-mapping>
此时访问必须使用list,不能使用Set
3·使用Map
使用Map:
public class Department {
private int id;
private String name;
//private Set<Employee> emps;
//private List<Employee> emps;
private Map<String,Employee> emps;
<map name="emps">
<key column="departId"/>
<map-key type="string" column="name"/>
<one-to-many class="Employee"/>
</map>
因为Map要使用键值对,所以要提供键,<map-key type=”string” column=”name”/>
注意:
1) type=”string”,不能写成type=”String” !!!!
2) column=”name”,指使用dempatment对象的name值作为key,如果你写成别的,比如:name1,表结构就会加上此列
总结:
集合性能的分析
对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是当系统需要使用集合属性时才从数据库装载关联的数据。 Hibernate 对集合属性默认采用延迟加载,在某些特殊的情况下为 set,,list,map 等元素设置lazy="false" 属性来取消延迟加载。
可将集合分成如下两类:
有序集合:集合里的元素 可以根据 Key 或 Index 访问
无序集合:集合里的元素中能遍历
有序集合的属性有增加、删除及修改中拥有较好的性能表现。在设计较好的 Hiberate domain Object 中,集合属性通常都会增加 inverse="true" 的属性,此时集合端不再控制关联关系。映射 Set 集合属性时,如果 element 元素包括 not-null="true" 属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键,但 List 集合属性的表总是以外键和元素次序列作为联合主键。