mappedBy

来源:互联网 发布:如何telnet端口号 编辑:程序博客网 时间:2024/05/17 02:50
一。mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段
 
  数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby=" ")
 
  把关系的维护交给多方对象的属性去维护关系
 
  对于mappedBy复习下:
 
  a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
 
  b) mappedBy标签一定是定义在the owned side(被拥有方的),他指向theowning side(拥有方);
 
  c) 关系的拥有方负责关系的维护,在拥有方建立外键。所以用到@JoinColumn
 
  d)mappedBy跟JoinColumn/JoinTable总是处于互斥的一方 
 
  二。下面是我自己的理解,一直对hibernate中的维护关联关系不太了解,总不知道他们具体指的是什么
 
  这里的维护关联关系,拿多对多来说就是中间表,在不设置cascade的情况下,中间表由负责维护关联关系的一方维护 
 
  举例说明:
 
  Game 和User  两个实体类,他们是多对多的关系,有中间表t_game-user.
 
  在User中配置有:
 
  @ManyToMany(mappedBy="users")
 
  public List<Game> getGames() {
 
  return games;
 
  }
 
  Game中配置有:
 
  @ManyToMany
 
  @JoinTable(name = "t_game_user",
 
  joinColumns = {@JoinColumn(name = "game_id",referencedColumnName="gameId")},
 
  inverseJoinColumns = {@JoinColumn(name = "user_id",referencedColumnName="id")})
 
  public List<User> getUsers() {
 
  return users;
 
  }
 
  所以说由Game来维护他们的关联关系,即中间表
 
  表现形式:
 
  1.因为没有配置cascade所以分别给Game,User添加4条数据,然后手动在中间表中添加他们的关联关系
 
  2.在程序中执行删除User,
 
  Hibernate: delete from t_user where id=?
 
  Hibernate: delete from t_user where id=?
 
  Hibernate: delete from t_user where id=?
 
  Hibernate: delete from t_user where id=?
 
  删除了User,并没有对中间表发生影响
 
  3.在程序中执行删除Game
 
  Hibernate:delete from t_game_user where game_id=?
 
  Hibernate:delete from t_game_user where game_id=?
 
  Hibernate:delete from t_game_user where game_id=?
 
  Hibernate:delete from t_game_user where game_id=?
 
  Hibernate:delete from t_game where game_id=?
 
  Hibernate:delete from t_game where game_id=?
 
  Hibernate:delete from t_game where game_id=?
 
  Hibernate:delete from t_game where game_id=?
 
  对中间表产生了影响,说明是Game在维护他们之间的关联关系
 
  三。下面这里是一对多的维护关联关系,(同样是在部设置cascade的前提下)一对多的关联关系其实更简单,因为他们之间没有中间表,User和Group,他们的关联关系就是体现在one方(group)的主键是Many方(User)的外键,这个关联关系就在User的表中。因为有外键的存在,group在user删除之前,是不能够删除的,所以他们之间维护关联关系的任务就只能交给Many方(User)
0 0