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

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指向谁,就由谁负责维护关系

猜你喜欢

转载自blog.csdn.net/sky274548769/article/details/78731676