一个工作组(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. vscode增加sftp扩展

    下载 sftp-sync 扩展插件 填写配置 快捷键 ctrl+shift+P 打开指令窗口,输入sftp:config,回车,就会在当前工作工程的.vscode文件夹下生成一个sftp.json文件 ...

  2. 3D旋转矩阵的推导过程

    3D旋转矩阵的推导过程 包含平移的线性变换称作仿射变换,3D中的仿射变换不能用 3 x 3 矩阵表达,必须使用4 x 4矩阵. 一般来说,变换物体相当于以相反的量变换描述这个物体的坐标系.当有多个变换 ...

  3. 看到了一篇不错的tensorflow文章

    http://dataunion.org/28906.html 本文作者 Steven Dufresne,总结了新手学 TensorFlow 需要的核心知识点和实操内容,旨在鼓励更多人借 Tensor ...

  4. CentOS6.8 RPM包安装快速zabbix22

    CentOS6.8 RPM包安装快速zabbix22 yum install -y epel-release # yum install -y httpd php php-devel mysql-se ...

  5. CHECKPOINT - 强制一个事务日志检查点

    SYNOPSIS CHECKPOINT DESCRIPTION 描述 预写式日志(Write-Ahead Logging (WAL))缺省时在事务日志中每隔一段时间放一个检查点. (要调整这个原子化的 ...

  6. SqlServer数据库练习20190211

    一条update语句,修改多个条件 update orderdt_jimmy set qty = (case else qty end); 好了,就这样

  7. mybatis保存时将数据库自动生成的主键返回

    场景 保存订单数据和订单详情数据时需要将订单的主键作为关联子段添加到明细表中,需要将保存订单时的主键返回给供保存明细表时使用 添加xml中新增数据时的配置 <insert id="in ...

  8. linux ping-测试主机之间网络的连通性

    博主推荐:更多网络测试相关命令关注 网络测试  收藏linux命令大全 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问 ...

  9. c++基础_特殊的数字

    #include <iostream> #include <math.h> using namespace std; int main(){ ;i<;i++){ ; )% ...

  10. 创建Tensor

    目录 创建Tensor numpy, list numpy list zeros, ones, fill zeros ones fill random 打乱idx后,a和b的索引不变 constant ...