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
- hibernate关系映射管理(一对一,多对多)
- hibernate关系映射管理(一对多,多对一,一对一,多对多)
- hibernate关系映射管理(一对多,多对一,一对一,多对多)
- Hibernate双向一对一,一对多,多对多关系映射
- Hibernate 关系映射 (一对一,一对多,多对多)
- Hibernate关联关系映射 一对一 一对多 多对一
- hibernate 第七章 映射一对一 多对多关联关系
- Hibernate 关系映射案例(一对一关系,一对多关系,多对多关系)
- hibernate关联映射:多对一、一对一
- hibernate一对一,一对多,多对一,多对多关系映射与级联
- Hibernate 基于注解的方式 实现的关系映射案例(一对一关系,一对多关系,多对多关系)
- Hibernate的映射关系与级联(一对一、一对多、多对多)
- Hibernate.hbm.xml映射关系(一对一、一对多、多对多)
- Hibernate关联关系映射配置(一对多,多对多,一对一)
- Hibernate映射关系之一对一 and 一对多 or 多对一
- hibernate对象关系映射(一对一,一对多,多对一,多对多的单向,双向映射)
- hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
- Hibernate关系映射一对一
- Python Numpy数组保存
- 技能测试1:面向对象编码实现用户注册
- C/C++学习笔记-开篇
- ehcache 缓存使用
- jar解包,打包jar
- hibernate关系映射管理(一对一,多对多)
- Sass入门整理
- 第五章子类和父类
- 构建Linux根文件系统(三)
- Eclipse与intelliJ IDEA 的区别(个人见解)
- Kotlin上线啦!!!
- Linux CentOS7 发送QQ邮件问题解决方案
- 在linux搭建博客(1)
- 使用Fast RCNN跑通Demo