(一)、多对一
1.映射关系创建2.测试 (二)、多对多
1.表关系创建2.测试 (一)、多对一
示例:一个用户(User)只能有一个角色(Role),一个角色(Role)可以对应多个用户(User),User 表通过role_id和 Role 表的id相关联。
1.映射关系创建 @ManyToOne:表对应关系;
mapperBy:在关联表中的映射;@JoinColumn:当前表与其它表关联的外键;
name:外键名称。
注:
重写toString方法不要造成死循环;项目配置文件中添加配置,开启懒加载:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
表 User:... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @ManyToOne @JoinColumn(name = "role_id") private Role role; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + ", sex='" + sex + ''' + ", role=" + role.getRole_name() + '}'; } ...}
表 Role:... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @OneToMany(mappedBy = "role") private Set
... @Autowired private UserRepository userRepository;@Test void testOneToMany(){ List
示列:*一个User对应可能对应多个Menu,一个Menu也可能对应多个User,两个表都通过id相关联。
1.表关系创建 @ManyToMany(表间关系)
cascade(级联操作)详情见:资料1,资料2
CascadeType.ALL:级联所有实体状态转换;
CascadeType.PERSIST:持久化,级联保存;
CascadeType.MERGE:级联实体合并操作;
CascadeType.REMOVE:级联实体删除操作;
CascadeType.REFRESH:级联实体刷新操作;
CascadeType.DETACH:级联实体分离操作;
mapperBy:映射字段(关联表字段);@JoinTable(中间表)
name:中间表名称(名称任意);
joinColumns(当前表与中间表关联字段信息)
name:中间表与当前表关联的字段(任意定义);
referencedColumnName:当前表与中间表关联的字段(当前表中的字段)
inverseJoinColumns:关联表与中间表关联字段信息。
表 Role:... @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "role_menu", joinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "menu_id", referencedColumnName = "id")}) private Set
表 menu:... @ManyToMany(mappedBy = "menus") private Set
... @Autowired private RoleRepository roleRepository; @Autowired private MenuRepository menuRepository; @Test void testManyToMany() { Menu menu0 = new Menu(); menu0.setWork("学习" ); Menu menu1 = new Menu(); menu1.setWork("看书"); Menu menu2 = new Menu(); menu2.setWork("打游戏"); System.out.println("多对多查询 Role:"); List