关闭

Hibernate annotation配置方式的MappedBy使用详解

标签: MappedBy
384人阅读 评论(0) 收藏 举报
分类:
原文链接: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.   
  7. Set<User> users=new HashSet<User>();  
  8. users.add(user);  
  9. 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.class1);  
  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 来生成一个第三方表记录关系 但这样做没什么必要 相同的关系会被存两次.

0
0
查看评论

hibernate mappedBy属性详解!

mappedBy的意思就是“被映射”,即mappedBy这方不用管关联关系,关联关系交给另一方处理1.规律:凡是双向关联,mapped必设,因为根本都没必要在2个表中都存在一个外键关联,在数据库中只要定义一边就可以了a) 只有OneToOne,OneToMany,ManyToMany上才有mappe...
  • qq_17011423
  • qq_17011423
  • 2017-03-31 11:05
  • 460

HIbernate Mappedby

双向一对一映射 class Card{ @OneToOne(optional=false,cascade={CascadeType.MERGE,CascadeType.REMOVE},mappedBy="card",fetch=FetchType.EAGER) Person...
  • ZYQ4Java
  • ZYQ4Java
  • 2015-01-21 16:43
  • 2292

Hibernate(四)基于注解annotation的配置

Hibernate04 Hibernate基于Annotation的配置          Annotation在框架中是越来越受欢迎了,因为annotation的配置比起XML的配置来说方便了很多,不需要大量的XM...
  • ErvinBao
  • ErvinBao
  • 2016-10-19 16:50
  • 1266

hibernate 中注解 一对多 主键中mappedBy的具体使用及其含义

1、@OneToMany(mapped=“由One的一方指向Many的一方,并且,这个属性应该等于Many的一方中含有One类的属性的属性名,否则会出错啦 ”) 如: 在ClassPO中: @OneToMany(targetEntity=StudentPO.class,mappedBy...
  • l_feilong
  • l_feilong
  • 2016-04-10 11:11
  • 2687

hibernate中mappedby的理解

mappedBy的意思就是“被映射”,即mappedBy这方不用管关联关系,关联关系交给另一方处理 1.规律:凡是双向关联,mapped必设,因为根本都没必要在2个表中都存在一个外键关联,在数据库中只要定义一边就可以了 a) 只有OneToOne,OneToMany,ManyToMany上才有m...
  • gaohuimina
  • gaohuimina
  • 2016-11-24 20:51
  • 1121

hibernate中的inverse和mappedBy

inverse和mappedBy是同一个东西,只是inverse是用于xml配置,而mappedBy则是用于注解中。 a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; b) mappedBy标签一定是定义...
  • gladmustang
  • gladmustang
  • 2015-01-29 11:24
  • 1084

Annotation和xml各自作为配置项的优点与缺点。

Annotation和xml各自作为配置项的优点与缺点。   一、Annotation 的优点    1、保存在 class 文件中,降低维护成本。    2、无需工具支持,无需解析。    3、编译期即可验证正确性,查错变得容易。    ...
  • lzhang616
  • lzhang616
  • 2015-06-29 14:23
  • 881

码农小汪-Hibernate学习9-hibernate双向关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

之前我学习了单向的关联,现在继续学习,双向的关联。这个关联关系的理解还是有点复杂,慢慢的理解懂了就好啦!这个过程不是一蹴而就的。我们需要不断的积累,才可以有所成绩的。年轻人,不要怕~慢慢来对啦,有的时候我们可能会采用逆向工程产生实体哦。所以我们要看得懂,会修改,会改变双向1-N关联对于1-N的关联,...
  • u012881904
  • u012881904
  • 2016-04-04 21:31
  • 2033

对hibernate的学习之用配置文件和annotation配置的区别

1.用配置文件配置hibernate ① 基础类: package com.bjsxt.hibernate; public class Student { private int id; private String name; private int age; public...
  • yuwenlanleng
  • yuwenlanleng
  • 2016-09-22 17:56
  • 879

Hibernate Annotation @mappedBy含义

原帖请见:http://revolver77.spaces.live.com/blog/cns!583C0A9A80FC1137!209.entry EJB3使用心得(1)-mappedBy的含义 1、关于mappedBy的含义: a) 只有OneToOne,OneToMany,ManyToMa...
  • z69183787
  • z69183787
  • 2014-01-21 16:40
  • 1799
    个人资料
    • 访问:246439次
    • 积分:3115
    • 等级:
    • 排名:第13250名
    • 原创:2篇
    • 转载:351篇
    • 译文:0篇
    • 评论:14条
    最新评论
    博客链接