如果通过添加新实体来更改 @oneToMany - 实体,则修订包含其他字段的空值



>为某人添加新地址时,应创建新的修订版。将创建修订,但修订中实体的其余字段标记为 null。

不同且正确:当我更改一个人的姓名时,会创建一个修订版,其中输入了所有字段。

个人实体:

@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:编号: 1修订本: 1001转数:1FIRST_NAME:空LAST_NAME:空

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

问题已解决(不完美(:

我改了行:

@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表将包含修订和字段。

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

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

最新更新