2017-06-10 15 views
0

私は最初のJEEアプリケーションを休憩APIと休止状態にしています。私は正しい方法でそれをする方法を知らない。私は、エンティティユーザに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<>(); 

を持っていると私は一人のユーザー

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

を取得するためにUserResourceメソッドを持っている今、私の問題は、私は一人のユーザーを取得しようとしているとき、私は例外組織を取得していますということであることを意味します.hibernate.LazyInitializationException - 私はもちろん、なぜ私は知っているが、これを行う方法は適切な方法でそれを取得する方法です。この@GETでは、このOneToManyコレクションは必要ありません。なぜなら、EGのユーザー投稿が必要な場合、私はuser/1/posts URLに電話し、すべてのユーザー投稿を受け取るからです。

この種類のアプリケーションを開発するにはどうすればよいですか?ユーザーエンティティから関係を削除し、必要なときにユーザーのデータベース投稿を検索するだけですか?それとも別の解決策がありますか?

答えて

1

データベースのモデルとシステム内の他のオブジェクトとの関連性のないユーザーに関する基本的な情報だけが特定のエンドポイントに関係する場合は、これらの属性をシリアル化プロセスで確認する必要があります。

常に無視したいフィールドの場合は、@XmlTransientと注釈を付けることができますが、これはビルド時に決定され、実行時に変更することはできません。別の方法としては、にあなたのサービスを変更することです

  1. How to Conditionally serialize with JAXB or Jackson
  2. Jacksons JsonViewまたはMOXy's external mapping-files

:あなたは動的にシリアル化の段階に影響を与える必要がある状況で、あなたは、これら二つの記事を見ることができますいずれか出力XMLにマーシャリングする属性のみを含むその特定のビューのクラスインスタンスを返します。今すぐあなたのXMLのマーシャリングは、そのBasicUserは団体のいずれかを持っていないか、という属性ドメインエンティティUserBasicUserにしていない基づきます

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

:これは簡単のようなJPA select newクエリを用いて達成することができますその特定のビューのためにシリアライズしたくないです。