FetchType.Lazy 在 Spring 引导中无法在 JPA 中工作



我有一个实体订单.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 作为懒惰的,因为我在获取订单时声明了 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);
}


}

我从邮递员那里得到的回复是:

{
"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 中看到用户对象。USING,@JSONIgnore有效,但是既然我已经将其声明为Fetchtype.Lazy为什么当我获取对象时USER对象Order来了?我不希望在获取订单对象时出现用户对象。

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

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

对我来说 添加@JsonIgnore注释有帮助

最新更新