FetchType.Lazy在春季启动时无法在JPA中使用

发布时间:2020-07-07 16:40

我有一个实体Order.java为:

package in.ashwin.onlinebookstore.entity;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="tbl_order")
public class Order {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long order_id;
    
    @OneToOne(cascade = CascadeType.MERGE,fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
    
    @Column(name="today_date")
    private Date todayDate;
    
    @Column(name="status")
    private String status;
    
    public Order(User user, Date todayDate) {
        
        this.user = user;
        this.todayDate = todayDate;
        this.status="pending";
    }

    public Long getOrder_id() {
        return order_id;
    }

    public void setOrder_id(Long order_id) {
        this.order_id = order_id;
    }

    public String getStatus() {
        return status;
    }

    

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Date getTodayDate() {
        return todayDate;
    }

    public void setTodayDate(Date todayDate) {
        this.todayDate = todayDate;
    }
    
    public Order() {
        
    }

}

我已经将Fetchtype包含为User和Order之间的惰性对象。从那时起,我在获取Order的时候声明了FetchType.LAZY,当我从邮递员那里进行测试时,仍然看到用户对象被调用。根据我的理解,FetchType是对象。 LAZY仅在需要时才调用。如果不调用,则将其忽略。

 @OneToOne(cascade = CascadeType.MERGE,fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id", nullable = false)
        private User user;

我获得所有订单的api是:

@GetMapping("/getAllPendingOrders")
    @PreAuthorize("hasRole('USER') or hasRole('MODERATOR') or hasRole('ADMIN')")
    public ResponseEntity<?> getOrders(Pageable pageable) {
        
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String user = auth.getName();
        UserDetailsImpl userDetails=(UserDetailsImpl)userdetailService.loadUserByUsername(user);
        
        Page<Order> orderList=orderRep.findByUserId(userDetails.getId(),pageable);
        if(orderList!=null) {
             return new ResponseEntity(orderList, HttpStatus.OK);
        }
        else {
             return new ResponseEntity("Noorders", HttpStatus.OK);
        }
       
        
    }

我从POSTMAN那里得到的回复是:

{
    "content": [
        {
            "order_id": 1,
            "user": {
                "id": 1,
                "username": "ashwin",
                "email": "ashwin@gmail.com",
                "password": "$2a$10$GoGUJh0Tzml5egBW5Wzbj.VLzfq4Z7YNCMnsOynLWufpQrWBdVLVi",
                "roles": [
                    {
                        "id": 2,
                        "name": "ROLE_MODERATOR"
                    },
                    {
                        "id": 1,
                        "name": "ROLE_USER"
                    }
                ]
            },
            "todayDate": "2020-07-02T17:09:45.057+0000",
            "status": "pending"
        },
        {
            "order_id": 2,
            "user": {
                "id": 1,
                "username": "ashwin",
                "email": "ashwin@gmail.com",
                "password": "$2a$10$GoGUJh0Tzml5egBW5Wzbj.VLzfq4Z7YNCMnsOynLWufpQrWBdVLVi",
                "roles": [
                    {
                        "id": 2,
                        "name": "ROLE_MODERATOR"
                    },
                    {
                        "id": 1,
                        "name": "ROLE_USER"
                    }
                ]
            },
            "todayDate": "2020-07-02T17:15:06.906+0000",
            "status": "pending"
        },
        {
            "order_id": 3,
            "user": {
                "id": 1,
                "username": "ashwin",
                "email": "ashwin@gmail.com",
                "password": "$2a$10$GoGUJh0Tzml5egBW5Wzbj.VLzfq4Z7YNCMnsOynLWufpQrWBdVLVi",
                "roles": [
                    {
                        "id": 2,
                        "name": "ROLE_MODERATOR"
                    },
                    {
                        "id": 1,
                        "name": "ROLE_USER"
                    }
                ]
            },
            "todayDate": "2020-07-02T17:16:36.373+0000",
            "status": "pending"
        },
        {
            "order_id": 4,
            "user": {
                "id": 1,
                "username": "ashwin",
                "email": "ashwin@gmail.com",
                "password": "$2a$10$GoGUJh0Tzml5egBW5Wzbj.VLzfq4Z7YNCMnsOynLWufpQrWBdVLVi",
                "roles": [
                    {
                        "id": 2,
                        "name": "ROLE_MODERATOR"
                    },
                    {
                        "id": 1,
                        "name": "ROLE_USER"
                    }
                ]
            },
            "todayDate": "2020-07-02T17:18:56.799+0000",
            "status": "pending"
        }
       
    ],
    "pageable": {
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 20,
        "paged": true,
        "unpaged": false
    },
    "totalPages": 2,
    "last": false,
    "totalElements": 39,
    "size": 20,
    "number": 0,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "numberOfElements": 20,
    "first": true,
    "empty": false
}

我仍然在JSON中看到该用户对象。使用@JSONIgnore可以正常工作,但是由于我将其声明为Fetchtype.Lazy,所以在我提取{时为什么USER对象来了{1}}对象?我不希望在获取Order对象时出现User对象。

回答1

User实体数据将不会被初始化并加载到内存中,除非对其进行显式调用。您的Order实体包含user字段。因此,当序列化被调用用户的订单数据获取器并使用另一个查询获取用户数据时。

如果您不想使用@JsonIgnore,请为没有用户字段的订单创建一个响应类,并映射您的数据。