首页 > 解决方案 > 如果通过添加新实体更改 @oneToMany - 实体,则修订包含其他字段的空值

问题描述

当为某人添加新地址时,应创建新的修订。创建了一个修订,但修订中实体的其余字段被标记为空。

不同且正确:当我更改某人的姓名时,会在输入所有字段的位置创建修订。

个人实体:

@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 REVTYPE: 1 FIRST_NAME: NULL LAST_NAME: NULL

例如,如果我更改名字,则输入 first_name 和 last_name 的字段。

标签: hibernate-envers

解决方案


问题已解决(不完美):

我改变了这一行:

@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. 添加一个引用人员 ID 的新地址

  3. 分配地址对象的此人上的 PUT 等操作。

= PERSON_AUD 表将包含修订和字段。

问题: 它并不完美,因为您必须手动将地址分配给该人。

还有其他可能的解决方案吗?


推荐阅读