2012-10-16 6 views
7

Có cách nào để giữ LAZY tải và deserialize đối tượng bằng cách sử dụng id thay vì đối tượng POJO.deserialize tải lười biếng trong hibernate và jackson

Tôi có 2 lớp được tham gia bằng mối quan hệ nhiều-nhiều.

Something như

public class User { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
    ) 
    @JoinTable(
      name = "User_EntityType", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "type_id") 
    ) 
    @JsonProperty 
    public Set<Type> types; 

} 

public class Type { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
      mappedBy = "types", 
      targetEntity = User.class 
    ) 
    @JsonProperty 
    public Set<User> users; 
} 

loại Số liệu này chỉ hoạt động tốt. Tôi có thể viết và đọc bằng cách sử dụng ngủ đông mà không có vấn đề gì.

Tuy nhiên, tôi muốn có thể trả về một đối tượng người dùng bằng API REST, vì vậy tôi đang sử dụng Jackson để deserialize nó. Vấn đề là khi tôi làm điều đó, nó deserialize mọi loại trong đối tượng người dùng, trong đó bao gồm các đối tượng loại khác, và nó tạo ra một mớ hỗn độn lớn.

Có thể thay vào đó, chỉ cần trả lại id Loại id dài thay vì Đặt loại?

Trả lời

4

Có thể, nếu bạn đang sử dụng Jackson 2.0, với tính năng Nhận diện đối tượng.

Nếu bạn chú thích một lớp học với chú thích @JsonIdentityInfo thì Jackson sẽ chỉ xuất ra đối tượng một lần; các tham chiếu tiếp theo sẽ sử dụng ID thay thế. Vì vậy, tập hợp các loại của bạn sẽ được sắp xếp theo ID, miễn là các loại đã được xuất một lần. Khi deserializing Jackson sẽ biến các ID trở lại thành các đối tượng.

Trong trường hợp của bạn tôi nghĩ rằng bạn sẽ cần phải chú thích lớp Loại của bạn như thế này:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Type { 
    ... 
} 

Xem http://wiki.fasterxml.com/JacksonFeatureObjectIdentity để biết chi tiết về cách sử dụng tính năng này.

0

Tôi đang đối mặt với vấn đề này cũng như các điểm cuối JAX-RS của tôi, mà phải sắp xếp và phục vụ các thực thể Hibernate bằng cách sử dụng các trình ánh xạ đối tượng của Jackson. Tùy chọn sử dụng các giải pháp như @JsonIgnore hoặc @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,... không phải là một tùy chọn đối với tôi, vì trường hợp trước đây có nghĩa là trường quan hệ bị bỏ qua khỏi đầu ra được tuần tự hóa và loại phương thức sau không giải quyết được vấn đề.

Vì vậy, giải pháp của tôi là để thiết lập các cờ sau trên mapper trước khi làm serialization thực tế:

ObjectMapper objMapper = new ObjectMapper(); 
objMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

Bằng cách này, không có sự cố gắng để cư đối tượng quan hệ, thay vì id của họ còn nguyên vẹn, và vì vậy tôi có thể giữ cờ fetch = FetchType.LAZY trên các trường quan hệ của tôi.