繁体   English   中英

Json,JPA,ManytoOne和OneToMany =>递归

[英]Json, JPA, ManytoOne and OneToMany => recursive

我试图阅读有关该主题的所有问答,但仍然缺少一些内容。

我的问题是:两个表KIDS和PARENT递归地互相调用

我有一个EJB要求一个带ID的Parent,-我(我认为)在需要的地方使用@OneToMany(mappedBy =“ parent”)。 结果可能会更好:当问父母(带id)时,看到有一个孩子带父母向孩子求...(几乎没有结束的故事:)

JSON输出

{
  "parentsid": 1,
  ...
  "parentsusername": null,
  "calendars": [],
  "kids": [
    {
      "kidsid": 2,
        ...
      "parent": {
        "parentsid": 1,
        ...
        "calendars": [],
        "kids": [
          {
            "kidsid": 2,               
            "calendars": [],
            "checkins": [],
            "parent": {
              "parentsid": 1,                 
              "calendars": [],
              "kids": [
                {
                  "kidsid": 2,                     
                  "calendars": [],    
                 .....

该班我有一个无状态的Bean调用:

@Stateless
@LocalBean
@Path("/checkin")
public class CheckinService {

 @PersistenceContext(unitName="chkin",type=PersistenceContextType.TRANSACTION)
 EntityManager entityManager;

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{id}")    
public Parent read(@PathParam("id") int id) {
    Parent parent = entityManager.find(Parent.class, id);        
    return parent;
}

实体类通过以下方式制作

/**
 * The persistent class for the KIDS database table.
 */
@Entity
@Table(name="KIDS")
@NamedQuery(name="Kid.findAll", query="SELECT k FROM Kid k")
public class Kid implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="KIDSID")
    private int kidsid;

    //bi-directional many-to-one association to Calendar
    @OneToMany(mappedBy="kid")
    private List<Calendar> calendars;

    //bi-directional many-to-one association to Checkin
    @OneToMany(mappedBy="kid")
    private List<Checkin> checkins;

    //bi-directional many-to-one association to Parent
    @ManyToOne             **// <=============**
    @JoinColumn(name="parentsId")
    private Parent parent;
}

家长的实体电话:

@Entity
@Table(name="PARENTS")
@NamedQuery(name="Parent.findAll", query="SELECT p FROM Parent p")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="PARENTSID")
    private int parentsid;

    ...

    //bi-directional many-to-one association to Calendar
    @OneToMany(mappedBy="parent")
    private List<Calendar> calendars;

    //bi-directional many-to-one association to Kid
    @OneToMany(mappedBy="parent") **// <=============**
    private List<Kid> kids;

数据库如下所示:两个数据库表,一个名为PARENTS,一个KIDS,从PARENTS到KIDS,有一个称为FK-KIDS_parentsID的前键

PARENTS ==========FK_KIDS_parentsId==========< KIDS
(PK) PARENTSID                                 (PK) KIDSID
                                               (FK) parentsId

堆栈跟踪

[error occurred during error reporting (printing native stack), id 0xc0000005]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(JI[I[I[IJ)I+0
j  sun.nio.ch.WindowsSelectorImpl$SubSelector.poll()I+43
j  sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Lsun/nio/ch/WindowsSelectorImpl$SubSelector;)I+1
j  sun.nio.ch.WindowsSelectorImpl.doSelect(J)I+63
j  sun.nio.ch.SelectorImpl.lockAndDoSelect(J)I+37
j  sun.nio.ch.SelectorImpl.select(J)I+30
j  sun.nio.ch.SelectorImpl.select()I+2
j  org.xnio.nio.SelectorUtils.await(Lorg/xnio/nio/NioXnio;Ljava/nio/channels/SelectableChannel;I)V+23
j  org.xnio.nio.NioSocketConduit.awaitWritable()V+26
j  org.xnio.conduits.AbstractSinkConduit.awaitWritable()V+7
j  io.undertow.conduits.ChunkedStreamSinkConduit.awaitWritable()V+7
j  org.xnio.conduits.ConduitStreamSinkChannel.awaitWritable()V+4
j  io.undertow.channels.DetachableStreamSinkChannel.awaitWritable()V+20
j  io.undertow.server.HttpServerExchange$WriteDispatchChannel.awaitWritable()V+20
j  org.xnio.channels.Channels.writeBlocking(Ljava/nio/channels/GatheringByteChannel;[Ljava/nio/ByteBuffer;II)J+34
j  io.undertow.servlet.spec.ServletOutputStreamImpl.write([BII)V+311
j  org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.write([BII)V+15
j  org.jboss.resteasy.util.CommitHeaderOutputStream.write([BII)V+11
j  com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer()V+24
j  com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeBytes([B)V+17
J 1041 C2 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V (185 bytes) @ 0x0000000002979c78 [0x00000000029796c0+0x5b8]
j  com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+41
J 1041 C2 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V (185 bytes) @ 0x0000000002979b78 [0x00000000029796c0+0x4b8]
j  com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+41
j  com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(Ljava/util/List;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+163
j  com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+7
j  com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+34
J 1041 C2 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V (185 bytes) @ 0x0000000002979b78 [0x00000000029796c0+0x4b8]
j  com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+41
J 1041 C2 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V (185 bytes) @ 0x0000000002979b78 [0x00000000029796c0+0x4b8]
j  com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+41
j  com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(Ljava/util/List;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+163
j  com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+7
j  com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+34
J 1041 C2 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V (185 bytes) @ 0x0000000002979b78 [0x00000000029796c0+0x4b8]
j  com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+41
J 1041 C2 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V (185 bytes) @ 0x0000000002979b78 [0x00000000029796c0+0x4b8]
j  com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V+41

正如评论所指出的那样,这似乎不是一个JPA问题,而是一个JSON序列化问题。 幸运的是,杰克逊提供了一些注释来处理这种情况。

在父@JsonBackReference上使用@JsonManagedReference ,在子@JsonBackReference上使用@JsonManagedReference ,您可能想尝试使用@JsonIdentityInfo

这是更多阅读内容 ,可能对您有所帮助。

这是循环依赖项和JSON序列化的问题,解决此问题的一种简单方法是在两个类上都使用@JsonIdentityInfo ,您应该具有以下内容:

@Entity
@Table(name="KIDS")
@NamedQuery(name="Kid.findAll", query="SELECT k FROM Kid k")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Kid implements Serializable {

@Entity
@Table(name="PARENTS")
@NamedQuery(name="Parent.findAll", query="SELECT p FROM Parent p")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Parent implements Serializable {

这样,您可以确保在每个孩子序列化中,父级都不会序列化,而只会得到他的ID。

@dcsohl谢谢您的帮助,-我想我现在明白了...

我回到了我的问题,然后又去解决了。 这是JSON递归问题。

取而代之的是,我使用@XmlTransient,我发现了另一种解决此问题的方法,-XMLTransient的问题是您没有获取ID,因此,我使用的是@XmlIDREF@XmlID来解决此问题。

@Entity
@Table(name="PARENTS")
@NamedQuery(name="Parent.findAll", query="SELECT p FROM Parent p")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="PARENTSID")
    @XmlAttribute @XmlID private int parentsid;

    ...

    @ManyToMany
    @JoinTable(name="PARENTS_KIDS",joinColumns=@JoinColumn(name ="PARENT_FK"), inverseJoinColumns=@JoinColumn(name = "KID_FK"))     
    private List<Kid> kids;

班级孩子

@Entity
@Table(name="KIDS")
@NamedQueries({
@NamedQuery(name="Kid.findAll", query="SELECT k FROM Kid k"),
}) 
@XmlRootElement
public class Kid implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="KIDSID")
private int kidsid;

@ManyToMany(mappedBy="kids")
@XmlAttribute @XmlIDREF private List<Parent> parents;

....
}

它有效:D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM