九.关联映射操作
1.一对多的关联关系
需求:角色与用户的一对多的关联关系
角色:一方
用户:多方
1.1.Users.java
package com.kennosaur.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="t_users")
public class Users {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@Column(name="address")
private String address;
@ManyToOne(cascade=CascadeType.PERSIST)
//@JoinColumn:维护外键
@JoinColumn(name="roles_id")
private Roles roles;
public Roles getRoles() {
return roles;
}
public void setRoles(Roles roles) {
this.roles = roles;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Users [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
1.2.Roles.java
package com.kennosaur.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_roles")
public class Roles {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="roleid")
private Integer roleid;
@Column(name="rolename")
private String rolename;
@OneToMany(mappedBy="roles")
private Set<Users> users = new HashSet<>();
public Integer getRoleid() {
return roleid;
}
public void setRoleid(Integer roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public Set<Users> getUsers() {
return users;
}
public void setUsers(Set<Users> users) {
this.users = users;
}
}
1.3 测试一对多的关联关系
@ManyToOne(cascade=CascadeType.PERSIST)在操作Users时,对roles数据级联保存
package com.kennosaur.test;
import java.util.Optional;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.kennosaur.App;
import com.kennosaur.dao.UsersRepository;
import com.kennosaur.pojo.Roles;
import com.kennosaur.pojo.Users;
/**
* 一对多关联关系测试
*
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=App.class)
public class OneToManyTest {
@Autowired
private UsersRepository usersRepository;
/**
* 一对多关联关系的添加
*/
@Test
public void testSave(){
//创建一个用户
Users users = new Users();
users.setAddress("天津");
users.setAge(32);
users.setName("小刚");
//创建一个角色
Roles roles = new Roles();
roles.setRolename("管理员");
//关联
roles.getUsers().add(users);
users.setRoles(roles);
//保存
this.usersRepository.save(users);
}
/**
* 一对多关联关系的查询
*/
@Test
public void testFind(){
Optional<Users> findOne = this.usersRepository.findById(5);
System.out.println(findOne);
Roles roles = findOne.get().getRoles();
System.out.println(roles.getRolename());
}
}
2.多对多的关联关系
需求:角色与菜单多对多关联关系
角色:多方
菜单:多方
2.1 Roles.java
package com.kennosaur.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_roles")
public class Roles {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="roleid")
private Integer roleid;
@Column(name="rolename")
private String rolename;
@OneToMany(mappedBy="roles")
private Set<Users> users = new HashSet<>();
@ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.EAGER)
//@JoinTable:映射中间表
//joinColumns:当前表中的主键所关联的中间表中的外键字段
// @JoinTable(name="t_roles_menus",joinColumns=@JoinColumn(name="role_id"),inverseJoinColumns=@JoinColumn(name="menu_id"))
@JoinTable(name = "t_roles_menus",joinColumns = @JoinColumn(columnDefinition = "role_id"),inverseJoinColumns = @JoinColumn(columnDefinition = "menu_id"))
private Set<Menus> menus = new HashSet<>();
public Integer getRoleid() {
return roleid;
}
public void setRoleid(Integer roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public Set<Users> getUsers() {
return users;
}
public void setUsers(Set<Users> users) {
this.users = users;
}
public Set<Menus> getMenus() {
return menus;
}
public void setMenus(Set<Menus> menus) {
this.menus = menus;
}
@Override
public String toString() {
return "Roles [roleid=" + roleid + ", rolename=" + rolename + ", users=" + users + "]";
}
}
2.2 Menus.java
package com.kennosaur.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_menus")
public class Menus {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="menusid")
private Integer menusid;
@Column(name="menusname")
private String menusname;
@Column(name="menusurl")
private String menusurl;
@Column(name="fatherid")
private Integer fatherid;
@ManyToMany(mappedBy="menus")
private Set<Roles> roles = new HashSet<>();
public Integer getMenusid() {
return menusid;
}
public void setMenusid(Integer menusid) {
this.menusid = menusid;
}
public String getMenusname() {
return menusname;
}
public void setMenusname(String menusname) {
this.menusname = menusname;
}
public String getMenusurl() {
return menusurl;
}
public void setMenusurl(String menusurl) {
this.menusurl = menusurl;
}
public Integer getFatherid() {
return fatherid;
}
public void setFatherid(Integer fatherid) {
this.fatherid = fatherid;
}
public Set<Roles> getRoles() {
return roles;
}
public void setRoles(Set<Roles> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Menus [menusid=" + menusid + ", menusname=" + menusname + ", menusurl=" + menusurl + ", fatherid="
+ fatherid + "]";
}
}
2.3RolesRepository.java接口
package com.kennosaur.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.kennosaur.pojo.Roles;
/**
* RolesRepository
*
*
*/
public interface RolesRepository extends JpaRepository<Roles,Integer> {
}
2.4 编写测试类
package com.kennosaur.test;
import java.util.Optional;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.kennosaur.App;
import com.kennosaur.dao.RolesRepository;
import com.kennosaur.pojo.Menus;
import com.kennosaur.pojo.Roles;
/**
* 多对多的关联关系的测试
*
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=App.class)
public class ManyToManyTest {
@Autowired
private RolesRepository rolesRepository;
/**
* 添加测试
*/
@Test
public void testSave(){
//创建角色对象
Roles r = new Roles();
r.setRolename("项目经理");
//创建菜单对象
Menus menus = new Menus();
menus.setMenusname("xxxx管理系统");
menus.setFatherid(0);
Menus menus2 = new Menus();
menus2.setFatherid(1);
menus2.setMenusname("项目管理");
//关联
r.getMenus().add(menus);
r.getMenus().add(menus2);
menus.getRoles().add(r);
menus2.getRoles().add(r);
//保存
this.rolesRepository.save(r);
}
/**
* 查询操作
*/
@Test
public void testFind(){
// Roles roles = this.rolesRepository.findOne(2);
Optional<Roles> roles = this.rolesRepository.findById(3);
System.out.println(roles.get().getRolename());
Set<Menus> menus = roles.get().getMenus();
for (Menus menus2 : menus) {
System.out.println(menus2);
}
}
}