Редакция содержит нулевые значения других полей, если изменить @oneToMany - сущность, добавив новую сущность - PullRequest
0 голосов
/ 13 июня 2019

Когда для человека добавляется новый адрес, должна быть создана новая ревизия. Редакция создана, но остальные поля сущности в редакции помечены как нулевые.

Разное и правильное: Когда я изменяю имя человека, создается ревизия, в которую вводятся все поля.

Персона:

@Entity
@Table(name = "Person")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Audited
public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 1)
    private Long id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @OneToMany(mappedBy="person")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Address> addresses = new HashSet<>();

Лицо, проводящее аудит:

@Entity
@Table(name = "person_aud")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class PersonAud implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private AuditIdentity auditIdentity;

    @Column(name = "revtype")
    private Short revtype;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @ManyToOne
    @MapsId("auditIdentity.id")
    @JoinColumn(name = "id", nullable = false)
    private Person person;

    @OneToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Address> addresses = new HashSet<>();

Адрес объекта:

@Entity
@Table(name = "address")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Audited
public class Address implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 1)
    private Long id;

    @Column(name = "street")
    private String street;


    @Column(name = "house_number")
    private String houseNumber;

    @Column(name = "zip_code")
    private String zipCode;

    @Column(name = "city")
    private String city;

    @Column(name = "state_province")
    private String stateProvince;

    @Column(name = "country")
    private String country;

    @ManyToOne
    @JsonIgnoreProperties("addresses")
    private Person person;

    @OneToOne
    @JsonIgnoreProperties("addresses")
    @NotAudited
    private PersonAud personAud;

Если я добавлю новый адрес, принадлежащий лицу XY, моя таблица будет выглядеть следующим образом:

PERSON_AUD: ID: 1 REV: 1001 РЕВТИП: 1 FIRST_NAME: NULL LAST_NAME: NULL

Например, если я изменяю имя, вводятся поля для имени и фамилии.

1 Ответ

0 голосов
/ 17 июня 2019

Проблема решена (не идеально):

Я изменил строку:

@OneToMany(mappedBy="person")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Address> addresses = new HashSet<>();

на:

@OneToMany(cascade = {CascadeType.ALL})
        @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
        private Set<Address> addresses = new HashSet<>();

Теперь процесс работает следующим образом:

  1. Добавить нового человека с пустым массивом адресов

  2. Добавить новый адрес, который ссылается на идентификатор человека

  3. Действуйте как PUT для этого лица, присваивающего объект адреса.

= Таблица PERSON_AUD будет содержать ревизию и поля.

ПРОБЛЕМА: это не идеально, потому что вы должны назначить адрес человеку вручную.

Есть ли другое возможное решение?

...