hibernate 数据多对一映射

一 综述:

 

       应用场景,每一个用户从属于一个用户组,用户表中有一个字段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 后记:

 

 这个程序配置真麻烦,搞了很长时间,还没理解透,仍然需要努力啊!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值