Сериализация объекта @ManyToOne с настроенным дочерним объектом в JPA / Джексоне - PullRequest
0 голосов
/ 23 января 2019

У меня есть два класса сущностей с двунаправленным отношением @OneToMany / @ManyToOne. Когда я сериализую Class A, я не хочу, чтобы внутри класса A было целое Class B, только поле id. Но класс B по-прежнему должен появляться как объект внутри класса A, а не просто как свойство. Как я могу этого достичь? Я использую JPA: 2,2 / Джексон: 2,9,0

@Entity
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

@Entity
public class B {

    private long id;
    private String str;
    private boolean bool;

    @OneToMany
    Set<A> aList;
    // ...
}

Желаемый результат класса A:

{
    "id" : 123;
    "b" : {
        "id" : 321;
    }
}

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вы можете попробовать использовать @JsonIgnoreProperties, чтобы игнорировать определенные поля

@Entity
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

@Entity
public class B {

    private long id;
    private String str;
    private boolean bool;

    @OneToMany
    @JsonIgnoreProperties({"ignoreField1", "ignoreField2"})
    Set<A> aList;
    // ...
}
0 голосов
/ 23 января 2019

Есть много способов добиться этого:

1) Игнорировать свойства:

@Entity
public class A {

    private long id;

    @JsonIgnoreProperties({"prop1", "prop2"})
    @ManyToOne
    private B b;
}

2) JsonIdentityInfo и PropertyGenerator.Требуется свойство id.

public class A {
   @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
   @JsonIdentityReference(alwaysAsId = true)
   public B b; 

   public long id;
}

3) JsonValue - указывает один метод / поле, которое следует использовать для сериализации всего экземпляра.

public class B {

    @JsonValue
    public long id;
}

4) Пользовательский сериализатор:

@Entity
@JsonSerialize(using = ASerializer.class)
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

В этом случае необходимо реализовать ASerializer.

Это не самый простой, но гибкий и детализированный способ настройки сериализованных объектов.

См. этот пример.

0 голосов
/ 23 января 2019

Вы можете игнорировать сериализацию для любого объекта, используя аннотацию @JsonIgnore пример кода должен быть:

@Entity
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

@Entity
public class B {

    private long id;
    private String str;
    private boolean bool;

    @OneToMany
    @JsonIgnore
    Set<A> aList;
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...