2017-05-12 62 views
0

下面是DAO。我得到第一个UppeningUsers对象。请注意,在这里对于这个功能,我不想返回位于UppeningUsers内的peopleWhoBlockedMe集合。为什么ResponseEntity在休眠加载时调用休眠

但是在不同的函数中,我想返回这些信息。请注意,它们都是LAZY抓取。随着evict我试图分离的对象,但仍然没有奏效。

首先RESTcontroller在下面。然后DAO代码如下。接下来是两个实体描述。

的问题是:我看到,直到

回报新ResponseEntity(返回,HttpStatus.OK);

只有一个查询是典型的选择。我不希望休眠去,并采取该特定UppeningUser UserBlock信息。因为这个服务响应不需要。然而,即使由于某种原因延迟加载 返回新的ResponseEntity(返回,HttpStatus.OK); 调用休眠。我不知道为什么在restcontroller它仍然连接到数据库。我试图驱逐,但没有工作。

JSON响应是 { “ID”:7, “peopleWhoBlockedMe”:[{ “blockedId”:7}]}

但我不希望这个函数返回这个peopleWhoBlockedMe。它可以是空的。

请注意,在其他服务,例如,我会明确要求这个peopleWhoBlockedMe,但只是这个业务逻辑,我不需要这些信息。所以,当我真正想打电话给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; 
    } 

} 


     } 

这部分是DAO。

@Repository 
public class UppeningUsersDAO { 

@Autowired 
private SessionFactory sessionFactory; 

public void setSessionFactory(SessionFactory sf) { 
    this.sessionFactory = sf; 
} 


/** 
* Get Existing user. Return error if there is not. 
* @param incomingUser user who requested access. 
* @return returns the guy information. All information. 
*/ 
@Transactional 
public UppeningUsers getUserDetails() throws Exception { 
    Session session = this.sessionFactory.getCurrentSession(); 
    Query query = session.createQuery("from UppeningUsers "); 

    UppeningUsers returning = (UppeningUsers) query.list().get(0); 

    session.evict(returning); 

    return returning; 

} 



} 

的主表是这个..

@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; 
} 


} 

现在这里是另一个表。

@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; 
} 

} 

更新:2忘了加上服务

 @Service("uppeningUserService") 
    public class UppeningUsersService { 

@Autowired 
UppeningUsersDAO uppeningUsersDAO; 



public UppeningUsers getUsersDetailsPartial() throws Exception { 

    return uppeningUsersDAO.getUserDetails(); 
} 








     } 
+3

在控制器中使用实体类不是一个好主意。阅读关于3层架构 – Jens

+0

然后它不创建重复的类。为什么我不能重用实体中使用的类。 – legend12345

+0

使用一个调试器,看看有多少信息存储在一个实体中,这对控制器来说是不可见的 – Jens

回答

0

詹斯说得对,她一句。图层方法和编写业务对象解决了这个问题。谢谢。