Java 为什么ResponseEntity在惰性加载处于活动状态时调用hibernate
下面是刀。我得到了第一个UppeningUsers对象。请注意,对于此函数,我不想返回位于UppeningUsers内的peopleWhoBlockedMe集合 但在不同的功能中,我想返回这些信息。请注意,它们都是惰性抓取。使用“逐出”时,我尝试分离对象,但仍然不起作用 首先,RESTcontroller如下所示。下面是DAO代码。下面是两个实体描述 问题是:我知道 返回新的响应状态(返回,HttpStatus.OK) 只有一个查询是典型的select查询。我不希望hibernate也获取特定UppeningUser的UserBlock信息。因为此服务响应不需要它。然而,尽管出于某种原因,它是延迟加载的 返回新的响应状态(返回,HttpStatus.OK); 调用hibernate。我不知道为什么在restcontroller中它仍然连接到数据库。我试图驱逐,但没有成功 json响应是 {“id”:7,“peopleWhoBlockedMe”:[{“blockedd”:7}]} 但是我不想让这个函数返回这个阻止我的人。它可以是空的 请注意,在其他服务中,例如,我将明确请求此peopleWhoBlockedMe,但仅出于此业务逻辑,我不需要此信息。所以我能做些什么来防止这种情况,所以无论何时我真的想打电话给阻止我的人,我都能得到它。不是自动的Java 为什么ResponseEntity在惰性加载处于活动状态时调用hibernate,java,hibernate,rest,Java,Hibernate,Rest,下面是刀。我得到了第一个UppeningUsers对象。请注意,对于此函数,我不想返回位于UppeningUsers内的peopleWhoBlockedMe集合 但在不同的功能中,我想返回这些信息。请注意,它们都是惰性抓取。使用“逐出”时,我尝试分离对象,但仍然不起作用 首先,RESTcontroller如下所示。下面是DAO代码。下面是两个实体描述 问题是:我知道 返回新的响应状态(返回,HttpStatus.OK) 只有一个查询是典型的select查询。我不希望hibernate也获取特定U
@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();
}
}