2012-10-16 4 views
7

LAZY öğesini POJO nesnesi yerine id kullanarak yükleme ve seri hale getirmenin bir yolu var mı?hibernate ve jackson'da tembel yükleme kaldırıldı

Çoktan çoğa ilişkisi olan 2 sınıfa sahibim. Bu

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

veri türü gibi

şey gayet güzel çalışıyor. Sorun olmadan hazırda bekletme özelliğini kullanarak yazabilir ve okuyabilirim. Ancak, bir REST API'sı olan bir User nesnesini döndürmek istiyorum, bu yüzden onu serileştirmek için Jackson'ı kullanıyorum. Sorun, bunu yaptığımda, diğer Nesne nesnelerini içeren Kullanıcı nesnesindeki her Tür'ü seri hale getiriyor ve büyük bir karmaşa yaratıyor.

Bunun yerine, Set of Set yerine Set of Long type ids yerine dönebilir mi?

cevap

4

Nesne Kimliği özelliği ile Jackson 2.0 kullanıyorsanız, bu mümkündür.

@JsonIdentityInfo ek notu ile bir sınıfa ek açıklama yazarsanız, Jackson nesneyi yalnızca bir kez çıkarır; sonraki referanslar bunun yerine kimliği kullanacaktır. Bu nedenle, türler dizininiz bir kez çıktığında, dizileriniz dizi olarak serileştirilecektir. Jackson'ın seri hale getirilmesinde kimlikleri tekrar nesnelere dönüştürür. Senin durumunda

Ben böyle senin Tip sınıfı açıklama gerekir düşünüyorum:

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

bu özelliğin nasıl kullanılacağına ilişkin ayrıntılar için http://wiki.fasterxml.com/JacksonFeatureObjectIdentity bakınız.

0

Bu soruna, Jack'in nesne eşleyicilerini kullanarak Hazırda Bekletme varlıklarını serileştirmesi ve sunması gereken JAX-RS uç noktalarında da görüyordum. @JsonIgnore veya @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,... gibi çözümleri kullanma seçeneği benim için bir seçenek değildi, çünkü eskiden ilişkisel alan serileştirilmiş çıktıdan çıkarılacak ve daha sonra ne tür olursa olsun sorunu çözmek için başarısız bir yöntem başarısız oldu. ,

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

Bu şekilde, bunun yerine kendi kimlikleri sağlam bırakıldı, ilişkisel nesneleri doldurmak için hiçbir girişimde:

Yani, benim çözüm öncesinde gerçek seri yapmaya Eşleştiricisi'hangi aşağıdaki bayrak ayarlamak oldu ve böylece ilişkisel alanlara fetch = FetchType.LAZY bayrağını taşıyabilirdim.