>为某人添加新地址时,应创建新的修订版。将创建修订,但修订中实体的其余字段标记为 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<>();
现在该过程的工作方式如下:
添加具有空地址数组的新人员
添加一个引用人员 ID 的新地址
操作类似于此人分配地址对象的 PUT。
= PERSON_AUD表将包含修订和字段。
问题: 它并不完美,因为您必须手动将地址分配给该人。
还有其他可能的解决方案吗?