服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - hibernate一对多关联映射学习小结

hibernate一对多关联映射学习小结

2020-12-31 15:42动力节点 JAVA教程

这篇文章主要介绍了hibernate一对多关联映射学习小结,需要的朋友可以参考下

一对多关联映射 

映射原理 

      一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。 

多对一和一对多的区别

  多对一和一对多的区别在于维护的关系不同:

(1)多对一:多端维护一端的关系,在加载多端时,可以将一端加载上来。

(2)一对多:一端维护多端的关系,在加载一端时,可以将多端加载上来。 

分类

一对多单向关联映射 

对象模型      

hibernate一对多关联映射学习小结    

      从对象模型中,我们可以看出,group持有user的一个引用。由于是单向关联,所以数据在加载group时,会把user加载上来,但是user并不知道group的存在。

       我们先看一下group和user的实体,以及映射文件。

group

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.bjpowernode.hibernate;
import java.util.set;
public class group {
 private int id;
 private string name;
 private set users;
  
 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;
 }
}

user

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.bjpowernode.hibernate;
public class user {
 private int id;
 private string name;
 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;
 }
}

user.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
<?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>
 <class name="com.bjpowernode.hibernate.user" table="t_user">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
 </class>
</hibernate-mapping>

group.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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>
 <class name="com.bjpowernode.hibernate.group" table="t_group">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <!-- users属性,表达的是本对象与user的一对多的关系 -->
  <set name="users">
    <!--当前表(group)的主键-->
   <key column="groupid"/>
   <one-to-many class="com.bjpowernode.hibernate.user"/>
  </set>
 </class>
</hibernate-mapping>

生成的表结构和测试数据

hibernate一对多关联映射学习小结hibernate一对多关联映射学习小结

缺点 

1)因为多端user不知道group的存在(也就是user不维护与group的关系),所以在保存user时,关系字段groupid为null,如果该字段设置为非空,则将无法保存数据。

2)因为user不维护关系,而group维护关系,group就会发出多余的update语句,保证group和user有关系,这样加载group时才把该users对应的用户加载上来。 

一对多双向关联映射

对象模型       

hibernate一对多关联映射学习小结  

        双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。 

我们看一下group和user的实体,映射文件

group

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.bjpowernode.hibernate;
import java.util.set;
public class group {
 private int id;
 private string name;
 private set users;
 
 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;
 }
}

user

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.bjpowernode.hibernate;
public class user {
 private int id;
 private string name;
 private group groups;
 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 group getgroups() {
  return groups;
 }
 public void setgroups(group groups) {
  this.groups = groups;
 }
}

group.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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="com.bjpowernode.hibernate">
 <class name="group" table="t_group">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <!-- 影响控制反转:inverse="false",多的一端维护关系,让一的一端失效 -->
  <set name="users" inverse="true">
   <key column="groupid" not-null="true"/>
   <one-to-many class="user"/>
  </set>
 </class>
</hibernate-mapping>

user.hbm.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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="com.bjpowernode.hibernate">
 <class name="user" table="t_user">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <!-- groups属性,表达的是本对象与group的多对一的关系 -->
  <many-to-one name="groups" class="group" column="groupid"/>
 </class>
</hibernate-mapping>

生成的表和测试数据 

hibernate一对多关联映射学习小结hibernate一对多关联映射学习小结

一对多双向关联的映射方式:

 1)在一的一端的集合上采用<key>标签,在多的一端加入一个外键

 2)在多的一端采用<many-to-one>标签

注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱。

inverse属性:

         inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inverse为true。

注意:inverse属性,只影响数据的存储,也就是持久化。 

目的 

       一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。

总结

以上所述是小编给大家介绍的hibernate一对多关联映射学习小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.sina.com.cn/s/blog_9c6852670102wvlu.html

延伸 · 阅读

精彩推荐
  • JAVA教程java运行windows的cmd命令简单代码

    java运行windows的cmd命令简单代码

    这篇文章主要介绍了java运行windows的cmd命令简单代码,有需要的朋友可以参考一下 ...

    java代码网5702019-10-26
  • JAVA教程java中BigDecimal进行加减乘除的基本用法

    java中BigDecimal进行加减乘除的基本用法

    大家应该对于不需要任何准确计算精度的数字可以直接使用float或double运算,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可...

    daisy1972020-07-11
  • JAVA教程Java 创建线程的3种方法及各自的优点

    Java 创建线程的3种方法及各自的优点

    这篇文章主要介绍了Java 创建线程的3种方法及各自的优点,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    zsq_fengchen1402020-07-19
  • JAVA教程实现Java删除一个集合的多个元素

    实现Java删除一个集合的多个元素

    Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。而我在for each时,从集合中删除了一个元素,这导致了i...

    java教程网2462020-06-02
  • JAVA教程Java中同步与并发用法分析

    Java中同步与并发用法分析

    这篇文章主要介绍了Java中同步与并发用法,较为详细的分析了java同步与并发所涉及的相关类与使用技巧,需要的朋友可以参考下 ...

    liuzx322902019-12-20
  • JAVA教程java开发微信公众号支付

    java开发微信公众号支付

    这篇文章主要给大家结合微信支付接口开发的实践,从获取用户授权到各主要接口的使用方法等方面介绍微信支付的关键点技术,有需要的小伙伴可以参考下...

    hebedich3342020-01-02
  • JAVA教程Java 异常的知识整理

    Java 异常的知识整理

    这篇文章主要介绍了Java 异常的知识整理的相关资料,需要的朋友可以参考下...

    tonghun4042020-11-29
  • JAVA教程详解Hibernate缓存与性能优化

    详解Hibernate缓存与性能优化

    在hibernate中,提到性能优化,很自然地我们就想到了缓存。缓存是什么,都有哪些呢?下面这篇文章就主要给大家介绍了关于Hibernate缓存与性能优化的相关...

    孟祥超5062020-08-20