Hibernate中@OneToMany与ManyToOne的mappedBy和@JoinColumn区别

  • @JoinColumn

    Hibernate的@OneToMany和@ManyToOne都可以用@JoinColumn。@JoinColumn有name属性需要设置成为多的一方的外键,当@OneToMany用@JoinColumn时,表示一的一方控制关联关系,并且@OneToMany设置了cascade=CascadeType.ALL,这时删除一端时不会抛出异常,多端外键被设置为null。
    主控制方在一端,
    也就是在一端set多端的时候,数据库会为你保存级联关系(在多端指向一端的外键设置值了)。
    SClass c=new SClass();
    c.getStudents().add(s);
    c.getStudents().add(s1);
    session.save(c);

  • mappedBy
    Hibernate的@OneToMany可以用mappedBy。@ManyToOne没有该属性,mappedBy有name属性需要设置成为“多”方class类里的“一”方的变量名,当@OneToMany用mappedBy时表示多方控制关联关系。
    如果保存设置一端的属性保存时,多端中一端的外键会设置为null。
    Java代码
    //多方:
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name=”cid”)
    public Classroom getClassroom() {
    return classroom;
    }
    public void setClassroom(Classroom classroom) {
    this.classroom = classroom;
    }
    Java代码
    //一方
    @OneToMany(mappedBy=”classroom”)
    public Set getUsers() {
    return users;
    }
    public void setUsers(Set users) {
    this.users = 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代码 收藏代码
    Classroom cr=(Classroom)session.get(Classroom.class, 1);
    System.out.println(cr.getUsers().iterator().next().getUname());
    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=?

    Hibernate: update User set cid=?, uname=?, upass=? where uid=?数据在数据库里也被正常更新
    
  • @JoinColumn和mappedBy都不用时会生成一个中间表。

你可能感兴趣的:(hibernate)