2012-07-07 28 views
5

Tôi đang triển khai một Dịch vụ Web RESTful bằng cách sử dụng Jersey. Tôi sử dụng hibernate để giao tiếp với cơ sở dữ liệu (mySQL). lớp tài nguyên ngủ đông của tôi bao gồm:Nhiều-Một với Bảng tham gia trong các lớp tài nguyên ngủ đông cho một JAX-RS sử dụng 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; 
} 

và lớp 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; 
} 

tôi đã sử dụng truy vấn này để lấy ativities:

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

Kết quả ở định dạng JSON không phải là đúng như :

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

Như bạn thấy thể loại được in 2 lần và chúng ta có thêm [] xung quanh nó. Khi tôi sử dụng một cơ chế khác của One-To-Nhiều mối quan hệ trong loại lớp như:

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

Và trong lớp Hoạt động:

@ManyToOne(optional = false) 
    private Category category; 

Và truy vấn này:

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

công trình Tất cả mọi thứ khỏe. Nhưng tôi phải sử dụng bảng tham gia vì tôi không giả sử thay đổi cơ sở dữ liệu.

Kết quả thích hợp sẽ giống như thế:

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

Tôi đánh giá cao sự giúp đỡ nào.

Trả lời

9

Xác định bảng kết nối ở nhiều phía, nhưng không định nghĩa lại nó ở một bên. Điều này tạo ra hai liên kết một chiều được ánh xạ với cùng một bảng thay vì một liên kết hai chiều.

Một hiệp hội hai chiều luôn có một bên chủ sở hữu (nơi bạn chỉ định các cột tham gia hoặc tham gia vào bảng để sử dụng, và một bên nghịch đảo mà nói chiếc mũ đó là nghịch đảo của phía bên kia bằng cách sử dụng các thuộc tính 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; 
} 

EDIT:

Ngoài ra, truy vấn của bạn chỉ nên chọn hoạt động, và không phải tất cả các thực thể tham gia bằng cách truy vấn, bằng cách thêm một lựa chọn khoản:

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

tôi apprec iate cho phản ứng. Giải pháp bạn đề cập có cùng vấn đề. – Ali

+0

Xem câu trả lời đã chỉnh sửa của tôi –

+0

Bây giờ, nó hoàn toàn hoạt động. – Ali

Các vấn đề liên quan