2017-06-10 53 views
0

我正在嘗試使用休息API和休眠來完成我的第一個JEE應用程序。我不知道如何以適當的方式做到這一點。我的意思是,我有實體用戶Jax-RS-java rest api和hibernate

@Entity 
@XmlRootElement 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String username; 
    private String password; 
    private String email; 
    private LocalDateTime lastDateOfLogin; 
    @OneToMany(fetch=FetchType.LAZY) 
    private List<Post> posts = new ArrayList<>(); 
    @OneToMany(fetch=FetchType.LAZY) 
    private List<Comment> comments = new ArrayList<>(); 
    @OneToMany(fetch=FetchType.LAZY) 
    private List<Like> likes = new ArrayList<>(); 
    @OneToMany(fetch=FetchType.LAZY) 
    private List<User> followers = new ArrayList<>(); 
    @OneToMany(fetch=FetchType.LAZY) 
    private List<User> following = new ArrayList<>(); 

,我有UserResource方法來獲取一個用戶

@GET 
    @Path("{id}") 
    public User getUser(@PathParam("id") long id) 
    { 
     return userService.getOne(id); 
    } 

現在我的問題是,當我試圖讓一個用戶我得到的異常組織.hibernate.LazyInitializationException - 當然,我知道爲什麼,但問題是如何做到這一點,以適當的方式。在這個@GET我不需要這個OneToMany集合,因爲當我想要E.g用戶職位,我會打電話給用戶/ 1 /職位的URL,我會收到所有的用戶職位。

如何開發這種應用程序?我應該從用戶實體中刪除關係,並在需要時在用戶的數據庫文章中進行搜索?或者也許有另一種解決方案呢?

回答

1

如果這個特定的端點只關心用戶的基本信息,而不關心你的數據庫模型與系統中的其他對象有什麼關係,那麼你需要以某種方式阻止序列化過程查看這些屬性。

如果它是一個您希望始終忽略的字段,那麼可以使用@XmlTransient對其進行註釋,但這是一個在生成時確定並且不能在運行時修改的決定。對於您需要動態地影響系列化一步的情況下,你可以看看這兩篇文章:

  1. How to Conditionally serialize with JAXB or Jackson
  2. Jacksons JsonViewMOXy's external mapping-files

另一種方法是修改您服務爲特定視圖返回一個類實例,該實例只包含要編組到輸出XML中的屬性。這可以很容易地與一個JPA select new查詢的方法實現:

SELECT new com.company.app.BasicUser(u.userName, other attributes) FROM User u 
WHERE u.id = :id 

現在你的XML編組將基於BasicUser,而不是你的域實體User,其中該BasicUser沒有任何關聯或屬性,你不希望爲該特定視圖序列化。