在JAXB(在JAX-RS中)使用包含ManyToMany,OneToMany关系

时间:2015-09-10 22:38:54

标签: mysql hibernate jpa jaxb jax-rs

我在尝试编写JAX-RS资源时遇到了问题。当我将@XmlRootElement添加到需要使用JAXB和RestEasy序列化为XML / JSON的JPA实体时。

抛出的错误:

 Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: pl.salonea.entities.Provider.industries, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155)
at org.hibernate.collection.internal.PersistentSet.size(PersistentSet.java:160)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:88)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:6

还有:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: pl.salonea.entities.Provider.industries, could not initialize proxy - no Session (through reference chain: pl.salonea.jaxrs.utils.ResourceList["resources"]->java.util.ArrayList[6]->pl.salonea.entities.Provider["industries"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:177)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:190)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:671)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeWithType(BeanSerializerBase.java:549)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:134)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:663)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:129)
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:851)

这是实体属性及其注释的代码:

@ManyToMany(mappedBy = "providers")
public Set<Industry> getIndustries() {
    return industries;
}

public void setIndustries(Set<Industry> industries) {
    this.industries = industries;
}

更新

我考虑如何实现这种JSON响应模式:

   {
    "description": "Provider 1",
    "attr1": 0,
    "attr2": 2,
    "attrN": "auction1.jpg",
    "industries": [
      {
        "link": {
       "href": "http://localhost:8080/rest/v1.0/industries/5",
        "method": "GET",
        "rel": "self"
      }
    },
    {
      "link": {
        "href": "http://localhost:8080/rest/v1.0/industries/6",
        "method": "GET",
        "rel": "self"
      }
    }
  ]
  }

1 个答案:

答案 0 :(得分:3)

如果您不需要序列化行业,您可以使用@XmlTransient注释getter ...否则,您可以在@ManyToMany注释中将fetch属性设置为EAGER,以防您知道每个提供商没有很多行业。如果选择该路径,并且在Industry实体中有一个指针返回到Provider,则需要使用@XmlTransient对其进行批注,以避免jaxb序列化程序进入无限循环循环。