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