2012-07-07 16 views
5

Jersey kullanarak bir RESTful Web Hizmeti uyguluyorum. Veritabanıyla iletişim kurmak için hazırda bekletme (mySQL) kullanıyorum. Benim hazırda kaynak sınıfları içerir:Çok-To-One ile JAX-RS için hazırda bekleyen kaynak sınıflarında birleştirme Tablosu ile Jersey

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

ve Kategori sınıfı:

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

Ben ativities getirmesi bu sorguyu kullandı:

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

JSON biçiminde sonuç doğru benzemez :

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

Gördüğünüz gibi kategori 2 kez basıldı ve ek bir [] etrafında var. Başka benzeri Kategori sınıfında Bir-çok ilişkisi mekanizmasını kullanırken:

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

Ve Etkinlik sınıfında:

@ManyToOne(optional = false) 
    private Category category; 

Ve bu sorguyu:

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

Her şey çalışıyor ince. Ama ben birleştirme tablosunu kullanmam gerekiyor çünkü veritabanını değiştirmeyi düşünmüyorum. Ben herhangi bir yardım için teşekkür ederiz

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

: gibi

uygun sonuç bakmak gerekir.

cevap

9

Bir taraftaki birleştirme tablosunu tanımlayın, ancak bir tarafa bir kez daha tanımlamayın. Bu, iki yönlü bir ilişki yerine aynı tabloyla eşlenen iki tek yönlü ilişki oluşturur.

Bir çift yönlü bir ilişki her zaman sütun katılmak veya kullanmak tablo ve mappedBy özelliğini kullanarak şapka diğer tarafın ters olduğunu söylüyor ters tarafını katılmak belirtmek sahibi tarafını (vardır:

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

DÜZENLEME:

Ayrıca

, sorgu yalnızca aktiviteyi seçmelidir ve sorgu tarafından katılmamış bütün varlıkları, seçkin bir maddesini ekleyerek: Ben apprec

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

cevap için geçin. Bahsettiğiniz çözümde aynı sorun vardı. – Ali

+0

Düzenlenmiş cevabıma bakın –

+0

Artık mükemmel çalışıyor. – Ali