hibernate关系映射管理(一对一,多对多)

来源:互联网 发布:淘宝扫码支付 编辑:程序博客网 时间:2024/06/07 05:19

1、多对多配置
在实际项目设计中,很多表之间的关系都需要使用第三张表来进行关联,而这种基本你都是多对多关系,hibernate配置如下:
以角色和菜单为例:
一个角色可以有多个菜单
一个菜单也可以被多个角色所有

menu类配置如下:

@Entity@Table(name="xx_plat_menu")public class Menu {    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    @Column(name="menu_id")    private int id;    @Column(name="menu_name",length=20)    private String name;    @ManyToMany(mappedBy="menus") // mappedby表示由谁来维护关系    private Set<Role> roles = new HashSet<Role>();

role类配置如下:

@Entity  //该类被hibernate当做实体给管理@Table(name="xx_plat_role")   //对应数据库的表public class Role {    @Id         //配置主键    @GeneratedValue(strategy=GenerationType.IDENTITY)  //自增策略    @Column(name="role_id")  //关联字段名和数据类型    private int id;    @Column(name="role_name")  //关联字段名和数据类型    private String name;    @Column(name="role_status")  //关联字段名和数据类型    private String status;    @Column(name="createdate", columnDefinition="DATETIME")  //关联字段名和数据类型    private Date createdate;    @OneToMany(mappedBy="role", fetch=FetchType.LAZY)   //一对多配置,    private Set<Admin> admins = new HashSet<Admin>();    @ManyToMany    @JoinTable(name="xx_relation_menu_role",                joinColumns=@JoinColumn(name="role_id"),                inverseJoinColumns=@JoinColumn(name="menu_id"))    private Set<Menu> menus = new HashSet<Menu>();   //@joinTable: 利用表来维护多对多关系   //joinColumns : 当前表在关系表的列名   //inverseJoinColumns:对应表在关系表的列名

完成配置以后,对于hibernate来说,还不是不需要编写任何SQL。只需要让每个需要关联的对象被hibernate管理起来,然后建立相应的关系,即可实现表数据的更新,如下:

@Override    public boolean addMenu(int id, int[] menus) {        Session session = this.sessionFactory.getCurrentSession();        Role role = (Role) session.get(Role.class, id);        for(int i=0; i<menus.length; i++) {            Menu menu = (Menu) session.get(Menu.class, menus[i]);            role.getMenus().add(menu);        }        return true;    }

此处注意:
由于我们上面通过Menu类的mappedBy=menus 配置由role的对象menus集合来维护关系,所以我们应该是把对象忘menus集合存储才能实现数据关联,此处切记不要弄反了,否则无法实现关联关系,如果想反向维护, 对换两个类的注解即可实现。
这里写图片描述

2、一对一关系配置

一对一的关系是指,两张表之间的数据只能存在一对一的关系,
比如人 和 身份证
账号 和 账户 和 银行卡
账号和账户是一对一关系
账户和银行卡是一对多关系
一对一配置需要使用oneToone和oneTomany组合来完成,

admin类的配置:public class Admin {    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    @Column(name="admin_id")    private int id;    @Column(name="admin_username",length=20)    private String userName;    @Column(name="admin_pwd",length=20)    private String pwd;    @ManyToOne(fetch=FetchType.LAZY)    @JoinColumn(name="admin_role")    private Role role;    @OneToOne(mappedBy="admin")    private Account account;

account类的配置

@Entity@Table(name = "xx_plat_acocunt")public class Account {    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    @Column(name="account_id")    private int id;    @Column(name="account_money")    private int money;    @ManyToOne    @JoinColumn(name="admin_id")    private Admin admin;

配置manyToone的地方编写外键JoinClounm

测试如下:
//创建账户

        Account a = new Account();        a.setAdmin(param);        a.setMoney(0);        int result = (Integer) session.save(param);        result = (Integer) session.save(a);

这里写图片描述

此处还是注意,mappedby指向谁,就由谁负责维护关系

阅读全文
0 0
原创粉丝点击