Hibernate 之List ,Bag,Map三种映射文件详解 (一)

2014-11-24 11:03:53 · 作者: · 浏览: 0

在hibernate中,有几种不同的映射文件,这几种映射文件各有特点,set在前面已经说过,这种映射关系多的一方中没有顺序关系,并且其中也不允许有重复的值,但是在list中,这两个刚好相反,list允许有重复的值,并且多的一方数据在持久化到数据中时也强调了数据的顺序,而bag中和了list和set的特点,bag允许有不用的值,但是这些值之间没有顺序,而map是一种键值对的结构,根据值得不同情况,又可以分为两种,一种情况是map的value可以直接对应到数据库中的字段类型,例如string,int,char,boolean等等,还有一种map的value本身是一个实体类,那么value 将被持久化到另外一个数据库表中。下面将对上面所说的情况来一一说明。
List类型,以房子和房间为例,下面是两个类的代码
[java]
public class House {

private int id;

private String location;

private List rooms;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getLocation() {
return location;
}

public void setLocation(String location) {
this.location = location;
}

public List getRooms() {
return rooms;
}

public void setRooms(List rooms) {
this.rooms = rooms;
}



}

public class House {

private int id;

private String location;

private List rooms;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getLocation() {
return location;
}

public void setLocation(String location) {
this.location = location;
}

public List getRooms() {
return rooms;
}

public void setRooms(List rooms) {
this.rooms = rooms;
}



}[java]
public class Room {

private String id;

private String number;

private House house;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public House getHouse() {
return house;
}

public void setHouse(House house) {
this.house = house;
}
}

public class Room {

private String id;

private String number;

private House house;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public House getHouse() {
return house;
}

public void setHouse(House house) {
this.house = house;
}
}

下面是两个类的映射文件。
House.hbm.xml


[html]
< xml version="1.0" encoding="UTF-8" >
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">















< xml version="1.0" encoding="UTF-8" >
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">













其中需要理解的就是list标签, name 属性表示对应House类中表示list对象的变量名,table表示了用数据库中那张表来存放list中所对应的对象,key表示 rooms表中的外键名称是什么,index标签是一个必须的标签,其中column指定了在rooms中的哪一列来存放list中元素进入数据库的顺序,那么在示例中指定了index_列来存放书顺序,这个列的值是从0开始的连续整数。因为list表示的本质上也是一种一对多的关系,那么还需要加上一个one-to-many标签,class来指定list中元素的类。
room.hbm.xml
[html]
< xml version="1.0" encoding="UTF-8" >
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">









< xml version="1.0" encoding="UTF-8" >
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">










下面是测试的代码
[java]
publ