原文链接:http://fair-jm.iteye.com/blog/1827045

说是使用详解,其实是我自己做了一些简单的试验.如有说错,请指正.

Annotation方式的MappedBy其实就是xml方式的inverse

http://stackoverflow.com/questions/10082434/mappedby-and-inverse-attributes-are-same 写道
In case of one-one or one-many or many to one, the key will be stored in one of the entites. It does not make any sense to store it in 2 places.

It essential tells hibernate that the key is at the other end of the relationship.

So if there are entities A and B which have a one to one relationship, and you see the mappedBy attribute in A, then the foreign key (which points to A) is stored in B.

但是对于他们的行为 我一直不是很了解 hibernate里的doc解释也不是很清楚:

写道
inverse 映射属性究竟表示什么呢?对于你和 Java 来说,一个双向关联仅仅是在两端简单地正确设置引用。然而,Hibernate 并没有足够的信息去正确地执行 INSERT 和 UPDATE 语句(以避免违反数据库约束),所以它需要一些帮助来正确的处理双向关联。把关联的一端设置为 inverse 将告诉 Hibernate 忽略关联的这一端,把这端看成是另外一端的一个镜象(mirror)

其实简单点说 就是MappedBy确定"维护关系"的一方,也仅仅是"维护关系"而已.其他的操作不影响.

实验环境:hibernate 3.6.10.Final

实体类:User(多方) Classroom(一方) Many-to-One的测试

Java代码  
  1. //多方:
  2. @ManyToOne(cascade=CascadeType.ALL)
  3. @JoinColumn(name="cid")
  4. public Classroom getClassroom() {
  5. return classroom;
  6. }
  7. public void setClassroom(Classroom classroom) {
  8. this.classroom = classroom;
  9. }
Java代码  
  1. //一方
  2. @OneToMany(mappedBy="classroom")
  3. public Set<User> getUsers() {
  4. return users;
  5. }
  6. public void setUsers(Set<User> users) {
  7. this.users = users;
  8. }


从多方插入就不再累述了.

这里就试着从不维护关系的一方来插入:

Java代码  
  1. User user=new User();
  2. user.setUname("cc");
  3. user.setUpass("pass");
  4. Classroom cr=new Classroom();
  5. cr.setClassname("class one");
  6. Set<User> users=new HashSet<User>();
  7. users.add(user);
  8. cr.setUsers(users);

这样只有一条插入语句:

Hibernate: insert into Classroom (cname) values (?)

为了更好地说明问题,我把以上一方的配置进行修改

加入了 cascade=CascadeType.ALL

同样执行以上代码 显示插入了两条:

Hibernate: insert into Classroom (cname) values (?)

Hibernate: insert into User (cid, uname, upass) values (?, ?, ?)

但是查看数据库就会发现:

虽然插入了..但是外键却没有值

一方不维护关系就可以明显的看出来,

但是一方的其他不影响关系的更新操作是没有问题的:

Java代码  
  1. Classroom cr=(Classroom)session.get(Classroom.class, 1);
  2. System.out.println(cr.getUsers().iterator().next().getUname());
  3. cr.getUsers().iterator().next().setUname("XX");

执行以上的代码:

显示:

Hibernate: select classroom0_.cid as cid1_0_, classroom0_.cname as cname1_0_ from Classroom classroom0_ where classroom0_.cid=?

Hibernate: select users0_.cid as cid1_1_, users0_.uid as uid1_, users0_.uid as uid0_0_, users0_.cid as cid0_0_, users0_.uname as uname0_0_, users0_.upass as upass0_0_ from User users0_ where users0_.cid=?

cc

Hibernate: update User set cid=?, uname=?, upass=? where uid=?

数据在数据库里也被正常更新

这样一番实验坐下来就可以很清楚的感觉到

mappedBy只是确定了由谁来维护关系而已 其他的操作并不影响.

一般情况下 如果要让两方都可以维护关系 我自己是在OneToMany后写JoinColumn 然后和ManyToOne里的外键列名取一样的。

当然也可以不写JoinColumn 来生成一个第三方表记录关系 但这样做没什么必要 相同的关系会被存两次.

Hibernate annotation配置方式的MappedBy使用详解相关推荐

  1. java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. ---------------------------------------- ...

  2. C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. 注:需要的jar包在后面给出链接. ---------------------- ...

  3. hibernate annotation注解方式来处理映射关系

    2019独角兽企业重金招聘Python工程师标准>>> 在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟 ...

  4. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

  5. Java操作数据库方式二DBCP使用详解

    ##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...

  6. AndroidManifest.xml文件配置教程及相关指令详解

    AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...

  7. 视频会议系统的种类、选择方式、未来发展趋势详解

    视频会议系统的种类.选择方式.未来发展趋势详解 视频会议现在已经非常的方便,解决远距离沟通问题,而视频会议系统主要分为硬件视频会议系统与软件视频会议系统两大类,不过这些年来随着互联网浪潮的推进,很难再 ...

  8. GPIO 配置之ODR, BSRR, BRR 详解

    STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...

  9. 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装爬虫框架Scrapy(离线方式和在线方式)(图文详解)...

    不多说,直接上干货! 参考博客 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装OpenCV(离线方式和在线方式)(图文详解) 第一步:首先,提示升级下pip 第二步 ...

  10. window10下拯救者笔记本RTX3060laptop配置CUDA11.0 pytorch版详解

    cuda版本11.0 torch=1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 可以直接用命令: pip install torch== ...

最新文章

  1. 一个计算机高手的成长(转)
  2. 3年编程经验无名校背景,全栈小哥是如何拿下Twitter Offer的?
  3. python中的闭包与装饰器教程
  4. fastjson对json字符串JSONObject和JSONArray互相转换操作示例
  5. Android中Log日志的管理之log工具类
  6. Centos7.5 VMtools的安装与卸载
  7. 传苹果新iPhone显示屏4英寸 可视面积扩大30%
  8. 零基础想学Python,明白这2点,越快年薪30W
  9. linux gradle目录结构,android studio中,project和module的目录结构
  10. 初始jquery事件-动态添加的新元素没有绑定上旧元素的事件
  11. excel熵值法计算权重_如何用熵值法确定指标权重?
  12. 问的书写规则是什么意思_汉字笔顺规则表
  13. sdcc对应stc51单片机
  14. react native 动画组件(Animated)浅析
  15. windows 服务器使用量高导致网络异常
  16. waf全称是什么?是干什么的?
  17. 微信公众号开发:服务器配置(Java)
  18. MATLAB报错:位置 1 处的索引无效。数组索引必须为正整数或逻辑值的一种解决办法
  19. 这个春节让算法教你:好好吃醋
  20. C#使用Emgu CV来进行图片人脸检测

热门文章

  1. 补偿IIR滤波器引入的延迟
  2. PLC编程实现堆栈功能
  3. MYSQL中的TCL语言
  4. AEJoy —— 表达式之弹性震动模拟详解【JS】
  5. 测试打印机性能的软件,万能打印机如何进行性能测试
  6. centos7下载php7.4
  7. Halcon教程十:把Halcon程序放入WPF程序里
  8. 了解NLP(自然语言处理)技术
  9. 分享java50道基础面试题(有答案)
  10. windowspythonpygame安装_pygame安装(windows pycharm)