Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么ResponseEntity在惰性加载处于活动状态时调用hibernate_Java_Hibernate_Rest - Fatal编程技术网

Java 为什么ResponseEntity在惰性加载处于活动状态时调用hibernate

Java 为什么ResponseEntity在惰性加载处于活动状态时调用hibernate,java,hibernate,rest,Java,Hibernate,Rest,下面是刀。我得到了第一个UppeningUsers对象。请注意,对于此函数,我不想返回位于UppeningUsers内的peopleWhoBlockedMe集合 但在不同的功能中,我想返回这些信息。请注意,它们都是惰性抓取。使用“逐出”时,我尝试分离对象,但仍然不起作用 首先,RESTcontroller如下所示。下面是DAO代码。下面是两个实体描述 问题是:我知道 返回新的响应状态(返回,HttpStatus.OK) 只有一个查询是典型的select查询。我不希望hibernate也获取特定U

下面是刀。我得到了第一个UppeningUsers对象。请注意,对于此函数,我不想返回位于UppeningUsers内的peopleWhoBlockedMe集合

但在不同的功能中,我想返回这些信息。请注意,它们都是惰性抓取。使用“逐出”时,我尝试分离对象,但仍然不起作用

首先,RESTcontroller如下所示。下面是DAO代码。下面是两个实体描述

问题是:我知道

返回新的响应状态(返回,HttpStatus.OK)

只有一个查询是典型的select查询。我不希望hibernate也获取特定UppeningUser的UserBlock信息。因为此服务响应不需要它。然而,尽管出于某种原因,它是延迟加载的 返回新的响应状态(返回,HttpStatus.OK); 调用hibernate。我不知道为什么在restcontroller中它仍然连接到数据库。我试图驱逐,但没有成功

json响应是 {“id”:7,“peopleWhoBlockedMe”:[{“blockedd”:7}]}

但是我不想让这个函数返回这个阻止我的人。它可以是空的

请注意,在其他服务中,例如,我将明确请求此peopleWhoBlockedMe,但仅出于此业务逻辑,我不需要此信息。所以我能做些什么来防止这种情况,所以无论何时我真的想打电话给阻止我的人,我都能得到它。不是自动的

  @RestController

  public class TempController {

@Autowired
UppeningUsersService uppeningUsersService;

@RequestMapping(value = "/testing", method = RequestMethod.GET)
public ResponseEntity<UppeningUsers> getPhotos() {
    try {
        UppeningUsers returned = uppeningUsersService.getUsersDetailsPartial();
        return new ResponseEntity<UppeningUsers>(returned, HttpStatus.OK);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

}


      }
主桌是这张

    @Entity
    @Table(name = "uppening_users")
    @Proxy(lazy = true)

    public class UppeningUsers {

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

@OneToMany(mappedBy = "blockedId",cascade =CascadeType.ALL, fetch = FetchType.LAZY)
private Set<UserBlocks> peopleWhoBlockedMe;


public UppeningUsers() {
    super();
}


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

    public Set<UserBlocks> getPeopleWhoBlockedMe() {
    return peopleWhoBlockedMe;
}

public void setPeopleWhoBlockedMe(Set<UserBlocks> peopleWhoBlockedMes) {
    this.peopleWhoBlockedMe = peopleWhoBlockedMes;
}


 }
更新:2忘记添加服务

     @Service("uppeningUserService")
     public class UppeningUsersService {

@Autowired
UppeningUsersDAO uppeningUsersDAO;



public UppeningUsers getUsersDetailsPartial( ) throws Exception {

    return uppeningUsersDAO.getUserDetails();
}








      }

詹斯的判决是对的。层方法和编写业务对象解决了这个问题。谢谢。

在控制器中使用实体类不是一个好主意。阅读关于三层架构的文章。创建重复类不是吗。为什么我不能重用实体中使用的类。使用调试器,看看一个实体中存储了多少信息,控制器看不到这些信息。你建议创建一个新的业务类,只设置你想要的业务类并发送它吗?@legend12345,它在开始时创建了重复项,但是,它允许您在表示层修复数据格式,尽管持久性层发生了变化。而且,顺便说一句,您的表示层的抽象已经不同于持久化的抽象,所以现在是将它们分开的好时机。关于你最后的评论-是的,创建一个额外的对象。
   @Entity
   @Table(name="user_blocks")
   @Proxy(lazy = true)

  public class UserBlocks {

@Id
@Column(name="id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
int id;

@Column(name = "blocked_id",insertable = false,updatable = false)
private int blockedId;


public int getBlockedId() {
    return blockedId;
}

public void setBlockedId(int blockedId) {
    this.blockedId = blockedId;
}

}
     @Service("uppeningUserService")
     public class UppeningUsersService {

@Autowired
UppeningUsersDAO uppeningUsersDAO;



public UppeningUsers getUsersDetailsPartial( ) throws Exception {

    return uppeningUsersDAO.getUserDetails();
}








      }