Сериализация различных экземпляров сущностей с одинаковым идентификатором как полей одного объекта - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть объект документа, а в документе есть автор и регистратор. Код:

@Entity
@Table(name = "doc", catalog = "public")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Document implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private Long id;


    @ManyToOne(fetch = FetchType.LAZY, targetEntity = User.class)
    @JoinColumn(name="author")
    @JsonIdentityReference(alwaysAsId = true)
    private User author;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = User.class)
    @JoinColumn(name="registrator")
    @JsonIdentityReference(alwaysAsId = true)
    private User registrator;

    // getters and setters goes here
}

@Entity
@Table(name="user")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    // other fields, getters, setters
}

В моем случае документ, созданный в jBPM, затем он через сериализацию / десериализацию появляется в моем приложении. Например, автор уже установлен в jBPM, поэтому у меня есть готовый объект. Далее я получаю пользователя регистратора через Spring Data, устанавливаю его в поле регистратора. И отправьте через API REST jBPM обратно в jBPM. API jBPM использует Джексона для сериализации объектов. Клиент jBPM отправляет на сервер карту, с документом и некоторыми другими дополнительными параметрами в качестве элементов карты. Если автор и регистратор разные пользователи, все работает нормально. Но если это один и тот же пользователь, с тем же идентификатором, но с разными экземплярами User - сериализация работает неправильно. Вместо Map с документом и моими параметрами я получаю «большую» хэш-карту с документом (без полей, кроме Id) и полями документа, но непосредственно в Map. И без моих других дополнительных параметров.

Если я отправляю автора и регистратора с одинаковым экземпляром (та же ссылка) - он снова работает нормально.

Я хочу сериализовать первое вхождение пользователя как полный объект, а затем тех же пользователей - как идентификатор.

Я хочу настроить мои классы на сериализацию / десериализацию, даже если я устанавливаю разные экземпляры с одинаковыми Идентификатор (например, клоны - если я снова получу второй класс из базы данных).

Как это сделать?

...