我知道这类问题已经被回答了很多次,而且有很多解决方案,但是,没有一个对我有效.我try 了@JsonIgnore@JsonIgnoreProperties@JsonManagedReference/@JsonBackedReference,但调试器仍然显示user引用了authority,它引用了user,它引用了authority,它引用了user...最重要的是it doesn't throw any exceptions.然而,我仍然想知道为什么会发生这种情况,为什么它不会抛出异常,以及它是否会影响生产力

我的实体很简单:有一个User

@Entity
@Table(name = "users_tb")
@NoArgsConstructor
@Getter
@Setter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Authority> authorities;
}

Authority

@Entity
@Table(name = "authorities_tb")
@NoArgsConstructor
@Getter
@Setter
public class Authority {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}

使用JpaRepository<T, V>检索用户的代码

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        var user = userRepository.findUserByUsername(username).orElseThrow(
              () -> new UsernameNotFoundException(ERR_USERNAME_NOT_FOUND));

        return new CustomUserDetails(user);
    }

调试器从loadUserByUsername返回前的输出状态:

user = {User@10781}
    > id = {Long@10784}
    > username = "John"
    > password = "$2a$10$xn3LI/AjqicFYZFruSwve.681477XaVNaUQbr1gioaWPn4t1KsnmG" 
    > authorities = {PersistentBag@10788} size = 2
        > 0 = {Authority@10818}
            > id = {Long@10784}
            > name = "READ"
            > user = {User@10784}
                > id = {User@10784}
                > username = "John"
                > password = "$2a$10$xn3LI/AjqicFYZFruSwve.681477XaVNaUQbr1gioaWPn4t1KsnmG" 
                > authorities = {PersistentBag@10788} size = 2
                    > 0 = {Authority@10818}
                    ...

推荐答案

循环依赖性本身并不是JPA的问题.

它们有两个潜在问题:

从软件设计的Angular 来看,循环依赖关系创建了一个不能轻易分解的类集群.

另一个问题是,当某个东西试图在这个循环中导航到其结束时,就会出现,这显然不起作用.典型情况如下:

  • 将其呈现为JSON(或XML).这是@JsonIgnore&;Co通过不在JSON中包含属性来处理.
  • 通常实现equalshashCodetoString以调用所有引用对象的相应方法.

JPA本身没有周期问题,因为它将在一级缓存中查找实体.

Java相关问答推荐

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

是否需要关闭Executors返回的执行器.newVirtualThreadPerTaskExecutor()?

找到允许的最大底片

AlarmManager没有在正确的时间发送alert

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

具有多种令牌类型和段的复杂Java 17正则表达式

Spring Boot Maven包

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

测试容器无法加载类路径初始化脚本

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

使用htmlunit和java单击按钮

当构造函数创建一个新实例时,Java为什么需要&new";

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

为了安全起见,有必要复制一份 list 吗?

具有多个分析模式的复杂分隔字符串的正则表达式

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

Eureka客户端无法使用用户/通行证注册到Eureka服务器