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都不用時會生成一箇中間表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章