Spring Data JPA:关联映射操作
1.一对一的关系关联
需求:用户和角色一对一关联
package com.example.jpa.pojo; import javax.persistence.*; @Entity @Table(name = "t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "name") private String name; /** * CascadeType.PERSIST 只有User类新增时, * 会级联Role对象新增。若Role对象在数据库存(跟新)在则抛异常(让Role变为持久态) */ @OneToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "role_id") //JoinColumn:维护一个外键的作用 private Role role; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } }
package com.example.jpa.pojo; import javax.persistence.*; @Entity @Table(name = "t_role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "name") private String name; @OneToOne(mappedBy = "role") private User user; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
/** * 添加用户同时添加角色 */ @Test public void test1() { //创建角色 Role role =new Role(); role.setName("小角色"); //创建用户 User user =new User(); user.setName("小用户"); //建立关系 user.setRole(role); role.setUser(user); //保存数据 userRepository.save(user); } /** * 根据用户id查询用户,同时查询用户角色 */ @Test public void test2() { User user =userRepository.getOne((long)13); System.out.println(user); Role role = user.getRole(); System.out.println(role); }
2.一对多关联关系
需求:从角色到用户的一对多关联关系
package com.example.jpa.pojo; import javax.persistence.*; @Entity @Table(name = "t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "name") private String name; @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "role_id") private Role role; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } }
package com.example.jpa.pojo; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity @Table(name = "t_role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "name") private String name; @OneToMany(mappedBy = "role") private Set<User> userSet = new HashSet<>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<User> getUserSet() { return userSet; } public void setUserSet(Set<User> userSet) { this.userSet = userSet; } }
/** * 添加用户同时添加角色 */ @Test public void test1() { //创建角色 Role role =new Role(); role.setName("小角色"); //创建用户 User user =new User(); user.setName("小用户"); //建立关系 user.setRole(role); role.getUserSet().add(user); //保存数据 userRepository.save(user); } /** * 根据用户id查询用户,同时查询用户角色 */ @Test public void test2() { User user =userRepository.getOne((long)13); System.out.println(user); Role role = user.getRole(); System.out.println(role); }
3.多对多的关联关系
需求:用户和角色多对多关系
package com.example.jpa.pojo; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity @Table(name = "t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "name") private String name; @ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.EAGER) //fetch = FetchType.EAGER:异步加载 //JoinTable 配置中间表信息 //joinColumns 建立当前表在中间表中的外键字段 @JoinTable(name = "t_user_role",joinColumns = @JoinColumn(name = "user_id") ,inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles =new HashSet<>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
package com.example.jpa.pojo; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity @Table(name = "t_role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "name") private String name; @ManyToMany(mappedBy = "roles") private Set<User> users =new HashSet<>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } }
/** * 添加用户同时添加角色 */ @Test public void test1() { //创建角色 Role role =new Role(); role.setName("小角色"); //创建用户 User user1 =new User(); user1.setName("小用户1"); User user2 =new User(); user2.setName("小用户2"); //建立关系 role.getUsers().add(user1); role.getUsers().add(user2); user1.getRoles().add(role); user2.getRoles().add(role); //保存数据 userRepository.save(user1); userRepository.save(user2); } /** * 根据用户id查询用户,同时查询用户所有角色 */ @Test public void test2() { User user =userRepository.getOne((long)13); System.out.println(user); Set<Role> roles = user.getRoles(); System.out.println(roles); }