2012-07-07 12 views
5

Jerseyを使用してRESTful Webサービスを実装しています。私はデータベース(mySQL)と通信するために休止状態を使用します。私の休止状態のリソースクラスが含まれます。Jerseyを使用するJAX-RSのhibernateリソースクラスのmany-to-one

@Entity 
public class Activity { 

    @Id 
    @GeneratedValue 
    private long id; 

@ManyToOne 
    @JoinTable(name="category_activity", 
    joinColumns={@JoinColumn(name="activities_id")}, 
    inverseJoinColumns={@JoinColumn(name="Category_id")}) 
    private Category category; 
} 

とカテゴリのクラスを:

@Entity 
public class Category { 

    @Id 
    @GeneratedValue 
    private long id; 

    @OneToMany 
    @Fetch(FetchMode.JOIN) 
    @JoinTable(name = "category_activity", 
    joinColumns = { @JoinColumn(name = "Category_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "activities_id") }) 
    @JsonIgnore 
    private Collection<Activity> activities; 
} 

私はativitiesを取得するために、このクエリを使用:

session.createQuery("from Activity a join a.category cs where cs.id= :categoryId order by a.key").setLong("categoryId", categoryId).list(); 

JSON形式の結果のような権利ではありません:

[[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}},{"id":10,"name":"General","description":""}]] 

カテゴリが2回印刷されているのを見ると、その周りに余分な[]があります。 私は別のようなカテゴリーのクラスの1対多の関係のメカニズムを使用する場合:

@OneToMany(targetEntity = Activity.class, mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JsonIgnore 
private Collection<Project> activities; 

そして、Activityクラスに:

@ManyToOne(optional = false) 
    private Category category; 

そして、このクエリ:

session.createQuery("from Activity as a where a.category.id= :categoryId order by a.key").setLong("categoryId", categoryId).list(); 

すべての作品を良い。しかし、私はデータベースを変更するとは思わないので、私は結合テーブルを使用する必要があります。

適切な結果は次のようになります。私は任意の助けのために感謝

[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}}] 

答えて

9

多くの側で結合テーブルを定義しますが、片側でもう一度定義しないでください。これにより、1つの双方向アソシエーションではなく、同じテーブルにマップされた2つの単方向アソシエーションが作成されます。

双方向関連は常にあなたが列を参加または使用するために、テーブルに参加を指定し、所有者側(と、帽子を言う逆の側面を有することがmappedBy属性を使用して、反対側の逆です:

public class Activity { 

    @ManyToOne // owner side: it doesn't have mappedBy, and can decide how the association is mapped: with a join table 
    @JoinTable(name="category_activity", 
       joinColumns={@JoinColumn(name="activities_id")}, 
       inverseJoinColumns={@JoinColumn(name="Category_id")}) 
    private Category category; 
} 

public class Category { 
    @OneToMany(mappedBy = "category") // inverse side: it has a mappedBy attribute, and can't decide how the association is mapped, since the other side already decided it. 
    @Fetch(FetchMode.JOIN) 
    @JsonIgnore 
    private Collection<Activity> activities; 
} 

編集:私はapprec

select a from Activity as a where a.category.id= :categoryId order by a.key 
+0

また、クエリが唯一のselect句を追加することにより、クエリによって接合されたすべてのエンティティの活動を選択し、そしてべきではありません応答のためにiateしてください。あなたが言った解決策にも同じ問題がありました。 – Ali

+0

私の編集した回答を参照してください –

+0

これは完全に機能しています。 – Ali

関連する問題