当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA忽略OneToMany双向的延迟加载

蓬运诚
2023-03-14

我与Jpa一起使用springboot(spring-boot-starter-父2.3.0版本)。我有作为父实体的User类和作为子实体的UserEmails。

用户实体

@Entity
@Table(name = "user")
public class User extends BaseEntity {

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

    @NotEmpty(message = "Name cannot be empty")
    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "user",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JsonManagedReference
    private List<UserEmails> userEmails = new ArrayList<UserEmails>();
 
    //setters and getters

     public void setUserEmails(List<UserEmails> userEmails) {
       this.userEmails= userEmails;
       this.userEmails.forEach(userEmail->{
         userEmail.setUser(this);
       });
}
}

用户角色实体

@Entity
@Table(name = "user_emails")
public class UserEmails extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(name="email")
    private String email;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id" , referencedColumnName = "id", nullable=true)
    private User user;

    //getters and setters
}

问题是,即使我在关系的两边都使用fetch类型作为懒惰,但当我调用getUserById或getAllUsers时,jpa也会加载用户电子邮件。

用户服务简介

@Service
public class UserServiceImpl extends BaseServiceImpl implements UserService {

    private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    UserDAO userDAO;

   @Override
    public User getUserById(int id) {
        logger.info("Executing getUserById() in user service");
        User user = null;
        
        try {
            user = userDAO.findById(id);
        } catch (DataAccessException e) {
            String message = "Some message"
            throw new Exception(message, e);
        }

        if (user == null) {
              String message = "Some message"
              throw new ResourceNotFoundException(message);
        }
        return user;
    }
} 

UserDAO

@Repository
public interface UserDAO extends JpaRepository<User, Long>{
    

    public User findById(int id);

}

共有1个答案

卫逸春
2023-03-14

是的,它可能会发生,如果您在一个控制器(例如<code>ResponseEntity)中使用持久化对象(在您的例子中是实例用户的对象)作为返回值,则会发生这种情况

你有两种可能:

> < li>

定义DTO对象,例如UserDTO,以及在的用户和UserDTO之间进行映射的映射器

要在用户类中使用其他注释,如@jsonignoreperties和@JsonProperty:

     @Entity 
     @Table(name = "user") 
     @JsonIgnoreProperties({"userEmails"})
     public class User extends BaseEntity {

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

     @NotEmpty(message = "Name cannot be empty")
     @Column(name = "name")
     private String name;

     @OneToMany(mappedBy = "user",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JsonManagedReference
     @JsonProperty("userEmails")
     private List<UserEmails> userEmails = new ArrayList<UserEmails>();

     //setters and getters

      public void setUserEmails(List<UserEmails> userEmails) {
        this.userEmails= userEmails;
        this.userEmails.forEach(userEmail->{
          userEmail.setUser(this);
        });
      }}

.

 类似资料:
  • 应用程序模块: app-routing.module.ts: 实体/实体-routing.module.ts: 实体/实体.组件. ts: 我还尝试使用以下方法在实体模块中定义路由,但组件仍会显示为导航到 /list,而不是 /entities/list。 我做错了什么?任何帮助是值得赞赏的!

  • Javers默认忽略而不是默认包含

  • 我使用hibernate 5作为JPA实现,我有一个@OneToMany双向关系的问题。 这些是我的实体: 我希望这种关系在两个方向上都是惰性的,因为我想通过fetch JOIN手动获取数据,如下面的查询: 但我的问题是hibernate忽略了@ManyToOne(fetch=FetchType.LAZY),因此Jackson由于引用链的无限递归(StackOverflowerr)而中断,如下所示

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 问题内容: 如果这是完全相同的内容,请纠正我,我知道这个话题经常被讨论,但是找不到确切的答案。 问题: 在MVC Web应用程序中处理Hibernate对象的最佳实用解决方案是什么? 细节: 我正在使用Hibernate,并希望在可能的情况下利用延迟加载。 我正在使用MVC风格的Webapp。 我讨厌获得延迟加载初始化异常。 我讨厌不得不在事务之间重新连接Hibernate对象。 选项: 渴望装载

  • 问题内容: 假设我有两个实体: 然后,我要保留“客户”实体,然后,参照先前添加的“客户”保留“订单”实体。当我从数据库中检索此客户并调用getOrders时,它将返回空集。这是正常行为吗?如果是,当我添加新的Order实体时,我该怎么做以自动刷新此集合? 问题答案: Jpa不会为您维护关系,因此应用程序需要设置双向关系的两端,以使它们与数据库保持同步。当您设置了order-> customer关系