hibernate-envers - 如果通过添加新实体更改 @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 的字段。
解决方案
问题已解决(不完美):
我改变了这一行:
@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 表将包含修订和字段。
问题: 它并不完美,因为您必须手动将地址分配给该人。
还有其他可能的解决方案吗?
推荐阅读
- javascript - 气体计算——找不到错误
- android - 为什么在最小化应用程序并返回后会显示导航栏?
- python - Django 错误:类型对象“Invoice_Line”没有属性“对象”
- javascript - 来自表单输入的Javascript多维数组循环
- android - 是否有 ADB 命令可以知道应用程序主页加载完成时的时间戳?
- c# - 如何从 PEM 格式的公钥创建证书对象?
- android - 检测传入的 SMS 消息
- python - 为什么使用 pandas.read_json 错误地读取字符串整数?
- google-analytics - 如何将 Google Tag Manager 或 Google Analytics 添加到 Quasar SSR 应用程序?
- excel - 生成 n 个随机数 汇总到单元格值 Vba 代码