Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将JAXB(在JAX-RS中)与包含多个、一个多个关系的JPA实体一起使用_Mysql_Hibernate_Jpa_Jaxb_Jax Rs - Fatal编程技术网

Mysql 将JAXB(在JAX-RS中)与包含多个、一个多个关系的JPA实体一起使用

Mysql 将JAXB(在JAX-RS中)与包含多个、一个多个关系的JPA实体一起使用,mysql,hibernate,jpa,jaxb,jax-rs,Mysql,Hibernate,Jpa,Jaxb,Jax Rs,我在尝试编写JAX-RS资源时遇到了一个问题。当我将@XmlRootElement添加到JPA实体时,需要使用JAXB和RestEasy将其序列化为XML/JSON 已引发的错误: Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: pl.salonea.entities.Provider.industries, could not ini

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

已引发的错误:

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

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

我考虑如果在JAXB这个实体返回(和序列化)之前调用GeTealStices()会怎么样?如果我在另一端添加@XmlTransient,我将阻止返回与给定行业相关的提供者(当前)实体。我想,是否只有这样的可能性才能返回这样懒惰的关系,只允许IDS或超媒体链接:?或者,我不能绕过这个无会话异常,通过在一个事务中以某种方式包装JAXRS资源方法,也许使用方法上的一些无状态bean和事务注释,然后获取提供者和延迟加载可能发生在一个事务中……是否有任何与实体、关系和jaxb(JAXR)相关的教程/最佳实践?我见过许多简单的实例,其中一个实体过于简单1您没有选择将@XmlTransient放在关系的任一侧以避免这种循环。是的,在REST world中,它被认为是一个非常好的习惯用法,即实体与超链接的关系。您可以使用atom链接对其进行建模,atom链接为这些链接提供了标准模式。2-您也可以延长会话/实体管理器的生命周期,但最终可能会陷入急切获取实体的陷阱。我建议在我们离开原来的问题时抛出一个新问题,否则评论将是无止境的。无论如何,如果你认为我的意见有助于推进你的推理,你可以投赞成票。
   {
    "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"
      }
    }
  ]
  }