У меня есть объект документа, а в документе есть автор и регистратор. Код:
@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. И без моих других дополнительных параметров.
Если я отправляю автора и регистратора с одинаковым экземпляром (та же ссылка) - он снова работает нормально.
Я хочу сериализовать первое вхождение пользователя как полный объект, а затем тех же пользователей - как идентификатор.
Я хочу настроить мои классы на сериализацию / десериализацию, даже если я устанавливаю разные экземпляры с одинаковыми Идентификатор (например, клоны - если я снова получу второй класс из базы данных).
Как это сделать?