很简答的三个表:

z_user(id,name,age),z_role(id,name),z_role_user(id,user_id,role_id);

其中z_role_user是关联表,user和role的关系是多对多,所以用到了@ManyToMany注解;

下面是三个实体:

@Entity
@Table(name = "z_user")
public class UserX {
    @Id()
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(length = 10)
    private String name;
    @Column(length = 10)
    private Integer age;
    @JsonIgnoreProperties(value = {"users"})
    @ManyToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
    @JoinTable(name = "z_role_user",
            inverseJoinColumns = @JoinColumn(name = "role_id"),
            joinColumns = @JoinColumn(name = "user_id"))
    private List<RoleX> roles;
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    @JsonIgnoreProperties(value = {"roles"})
    @ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "roles")
    private List<UserX> users;
@Entity
@Table(name = "z_role_user")
public class RoleUser {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "user_id")
    private Integer userId;
    @Column(name = "role_id")
    private Integer roleId;

(1)解决方式就是使用 @JsonIgnoreProperties;对标注的字段,禁用对方实体的序列化,比如UserX对象,查出roles后,就禁止RoleX对象继续序列化继续递归查询用户信息了;

(2)其中还有个问题,就是如果关联表字段不写@Column中的name下划线方式,会重复的关联字段错误;比如userId,他会认为有userId和user_id两个字段;

很简答的三个表:z_user(id,name,age),z_role(id,name),z_role_user(id,user_id,role_id);其中z_role_user是关联表,user和role的关系是多对多,所以用到了@ManyToMany注解;下面是三个实体:@Entity@Table(name = "z_user")public class UserX { @Id() @GeneratedValue(strategy = GenerationType. Iterator iter = list.iterator(); while(iter.hasNext()){ Student student = (Student)iter.next(); if(i.equals(student.getParentid())){ list2.add(student.getId()); getAll(student.getId(),list); return list2; @Override public Page findBySpecification() { Specification specification = new Specification() { @SneakyThrows
这是一个Bug JPA 我觉得是一个封装的很棒的框架,至于说很臃肿这个事,我觉得在需求需要很多复杂 查询 候,不适合用 JPA 。因为它的封装太棒了,以致于增强了表和实体类之间的耦合。不过在一些简单 查询 的部分,它真的太好用了。 而关于这个Bug,就不单单是 JPA 自身的问题了,究其原因是我在实体类中, 使用 了lombok框架的@Data,这是一个 使用 注解,在编译 修改语法树并且自动生成Getter、Se...
一、数据准备 在管理系统中,角色和用户是典型一对多关系,一个角色可以分配给多个用户,一个用户对应一个角色。准备两个实体类TestRole、TestUser类,并在数据库建好对应表结构z_test_roles、z_test_users两张表。 @Entity @Getter @Setter @Table(name = "z_test_roles") public class TestRole implements Serializable { @Column(na...
public List queryCategoryTree(Integer level) { // 查询 当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); return categoryTree; * @return public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); return categoryTreeDTO; public class ItemQuery { private Integer itemId;//id精确 查询 = private String itemName;//name模糊 查询 like //价格 查询 ...
jpa 实体 @ManyToOne @OneToMany无限递归问题描述解决办法 Cannot call sendError() after the response has been committed 在属性上添加注释 @JsonBackReference // data to json 和 JsonIgnore一样 // @JsonManagedRefere...