一 综述:
应用场景,每一个用户从属于一个用户组,用户表中有一个字段group_id 和 用户组中的一个字段id ,相关联。每个
用户组含有多个用户。
1 双向一对多映射
实质上是一对多和多对一的关联组合。在主控方配置单向一对多映射,在被控方配置多对一映射,
set 标签中存在一个属性,inverse ,若为false ,则表示主动方负责维护关联关系,为true表示被动方负责维护关联关系。
一般当inverse为true时,效率高 。 可以这样理解全国人民记住国家元首当然容易,但是要国家元首记住全国人民,那就
太难了。
2 首先配置vo 实体类
(1)User 类
public class User implements Serializable {
private int id ;
private String name ;
private int age ;
private Gr group ;
public Gr getGr() {
return group;
}
public void setGr(Gr group) {
this.group = group;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
(2) Group 类
public class Gr implements Serializable {
private int id ;
private String name ;
private Set <User> users = new HashSet<User>() ; //在此处进行初始化工作 ,java特性之一
// c++则不可以这样操作
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
Group中含有 User 类的集合实例, 而 User类中含有Group 的实力。 这样就形成双向对应关系。
3 Group.hbm.xml 映射文件:
<hibernate-mapping>
<class name="cn.bupt.duming.vo.Gr" table="gr" catalog="login">
<id name="id" type="java.lang.Integer">
<column name="id" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<set name="users" inverse="true" cascade="all">
<key>
<column name="group_id" /> //同样是外键对应的列名
</key>
<one-to-many class="cn.bupt.duming.vo.User" />
</set>
</class>
</hibernate-mapping>
4 User.hbm.xml 映射文件
<hibernate-mapping>
<class name="cn.bupt.duming.vo.User" table="user" catalog="login">
<id name="id" type="java.lang.Integer">
<column name="id" />
</id>
<many-to-one name="gr" class="cn.bupt.duming.vo.Gr" >
<column name="group_id" /> // 外键对应的列名
</many-to-one>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</class>
</hibernate-mapping>
5 测试代码
User user = new User();
user.setAge(20) ;
user.setName("duming") ;
user.setId(23) ;
Gr group = new Gr();
group.setName("admin") ;
group.setId(16) ;
user.setGr(group) ;
group.getUsers().add(user) ;
session.save(group) ;
6 输出的sql语句 如下:
Hibernate:
select
user_.id,
user_.group_id as group2_2_,
user_.name as name2_,
user_.age as age2_
from
login.user user_
where
user_.id=?
Hibernate:
insert
into
login.gr
(name, id)
values
(?, ?)
Hibernate:
insert
into
login.user
(group_id, name, age, id)
values
(?, ?, ?, ?)
7 后记:
这个程序配置真麻烦,搞了很长时间,还没理解透,仍然需要努力啊!