一个工作组(Group)里能够有多个用户(User),一个User仅仅属于一个Group,这是典型的多对一的关系。

在多对一的关系中正确的数据库设计是在多的这方(在这里是User这方)加一个Group的外键。假设数据库设计的与之相反就会产生冗余。请看以下这个样例:

友情提示:这是错误的设计方法:

GroupId

GroupName

UserId

1

Group_1

1

1

Group_1

2

UserId

UserName

1

moluo

2

xingzhe

这样在一的这方(也就是Group这方)设置外键关联,就会产生冗余(一个Group有N名User,这样设计就得反复N次冗余的GroupId和GroupName),因此在多对一时,数据库的设计是必须在多的这方加一的那方的外键!

先写Annotation版本号的多对一单向关联:

先建Group类:

  1. package com.hibernate.model;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.Id;
  5. import javax.persistence.Table;
  6.  
  7. @Entity
  8. @Table(name="_Group")
  9. public class Group {
  10. private int id;
  11. private String name;
  12. @Id
  13. @GeneratedValue
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26.  
  27. }

再建User类:

  1. package com.hibernate.model;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.Id;
  5. import javax.persistence.ManyToOne;
  6. import javax.persistence.Table;
  7.  
  8. @Entity
  9. @Table(name="_User")
  10. public class User {
  11. private int id;
  12. private String name;
  13. private Group group;
  14. @ManyToOne
  15. public Group getGroup() {
  16. return group;
  17. }
  18. public void setGroup(Group group) {
  19. this.group = group;
  20. }
  21. @Id
  22. @GeneratedValue
  23. public int getId() {
  24. return id;
  25. }
  26. public void setId(int id) {
  27. this.id = id;
  28. }
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35.  
  36. }

在多的这方加group的外键,并在get方法上注明:@manyToOne

配置文件:

  1. <mapping class="com.hibernate.model.User"/>
  2. <mapping class="com.hibernate.model.Group"/>

測试用例:

  1. package com.hibernate.model;
  2.  
  3. import static org.junit.Assert.*;
  4.  
  5. import org.hibernate.SessionFactory;
  6. import org.hibernate.cfg.AnnotationConfiguration;
  7. import org.hibernate.tool.hbm2ddl.SchemaExport;
  8. import org.junit.AfterClass;
  9. import org.junit.BeforeClass;
  10. import org.junit.Test;
  11.  
  12. public class ORMappingTest {
  13. public static SessionFactory sf = null;
  14. //@BeforeClass
  15. public static void beforeClass(){
  16. try{
  17. sf = new AnnotationConfiguration().configure().buildSessionFactory();
  18. }
  19. catch(Exception e) {
  20. e.printStackTrace();
  21. }
  22. finally{
  23. }
  24. }
  25.  
  26. @Test
  27. public void testSchemaExport(){
  28. new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
  29. }
  30.  
  31. //@AfterClass
  32. public static void afterClass(){
  33. sf.close();
  34. }
  35.  
  36. }

先写xml版本号的多对一单向关联:

Group和User类以及測试用例同上。不再赘述

我把映射文件贴出来:

User.hbm.xml:

  1. <?
  2.  
  3. xml version="1.0"?>
  4. <!DOCTYPE hibernate-mapping PUBLIC
  5. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  6. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  7. <hibernate-mapping package="com.hibernate.model">
  8.  
  9. <class name="User" table="_User">
  10. <id name="id">
  11. <generator class="native"/>
  12. </id>
  13. <property name="name"></property>
  14. <many-to-one name="group" column="groupId"></many-to-one>
  15. </class>
  16. </hibernate-mapping>

Group.hbm.xml:

  1. <?
  2.  
  3. xml version="1.0"?>
  4. <!DOCTYPE hibernate-mapping PUBLIC
  5. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  6. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  7. <hibernate-mapping package="com.hibernate.model">
  8. <class name="Group" table="_Group">
  9. <id name="id">
  10. <generator class="native"/>
  11. </id>
  12. <property name="name"></property>
  13. </class>
  14. </hibernate-mapping>

尊重版权,转载请注明本文链接

欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码就可以;


hibernate之多对一单向关联的更多相关文章

  1. 【SSH系列】Hibernate映射-- 多对一单向关联映射

    在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型 ...

  2. 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  3. (Hibernate进阶)Hibernate映射——多对一单向关联映射(四)

    介绍基于基本映射的关联关系映射. 概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述 ...

  4. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  5. Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  6. Hibernate从入门到精通(七)多对一单向关联映射

    上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...

  7. Hibernate(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的 相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映 射之前,首 ...

  8. Hibernate(七)多对一单向关联映射

    上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本 次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类 似,只是 ...

  9. [置顶] Hibernate从入门到精通(七)多对一单向关联映射

    上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...

随机推荐

  1. php中字符与字节的区别

    字符: 字符是可使用多种不同字符方案或代码页来表示的抽象实体.例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字 ...

  2. php判断是否引入某文件

    Code: /* 判断是否引入了公共文件demo.php */ $include_files = get_included_files(); $include_files_exist = 0 ; fo ...

  3. Java之抽象和封装

    ① 如何从现实世界中抽象出类?    根据软件开发需求: 发现类-->发现类的属性-->发现类的方法    ②   构造方法的作用和特点是什么?    作用:在创建对象时执行一些初始化操作 ...

  4. Youtube-dl 简短使用总结

    默认下载bestvideo+bestaudio,并通过ffmpeg -c copy output.mp4 简单的封装进mp4格式,而不进行转码. 有时候bestaudio 是opus编码的,但是mp4 ...

  5. 数据库系统概论(1)——Chap. 1 Introduction

    数据库系统概论--Introduction 一.数据库的4个基本概念 数据(data):数据是数据库中存储的基本单位.我们把描述事物的符号记录称为数据.数据和关于数据的解释是不可分的,数据的含义称为数 ...

  6. json 存 window.localStorage.setItem('hideColums',hideArr);

    onColumnSwitch:function(row, $element){ //JSON.parse() var showColumns=$('#table').bootstrapTable('g ...

  7. xamarin.forms 绑定页面里指定元素的某个属性值

    {Binding Source={x:Reference elementName}, Path=BindingContext.propertyname, Mode=OneWay} elementNam ...

  8. java中属性命名get字母大小写问题

    java文件 company.java private int sTime; public void setSTime (int sTime) {        this.sTime = sTime; ...

  9. yum升级php版本

    查看当前 PHP 版本 1 php -v 查看当前 PHP 相关的安装包,删除之 1 2 3 4 5 yum list installed | grep php   yum remove php   ...

  10. Day 14A 网络编程入门

    ---恢复内容开始--- 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机网络中的设备和计算机网络的用户已经 ...