当前位置: 首页 > 知识库问答 >
问题:

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

康照
2023-03-14

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

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

个人实体:

@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版本:1001版本类型:1名字:NULL姓氏:NULL

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

共有1个答案

裘丰
2023-03-14

问题已解决(不完美):

我改变了路线:

@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分配地址对象。

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

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

    还有其他可能的解决办法吗?

  •  类似资料:
    • 问题内容: 假设您有一个类,并创建了一个HashSet来存储此类的实例。如果尝试添加相等的实例,则集合中仅保留一个实例,这很好。 但是,如果HashSet中有两个不同的实例,并采用一个实例并使其与另一个实例完全相同(通过复制字段),则HashSet将包含两个重复的实例。 这是演示此代码的代码: 上面代码的输出: 有没有一种方法可以强制HashSet验证其内容,以便删除在上述情况下创建的可能重复条目

    • 我有两个实体具有@OneTomany(Entity1)&@ManyToOne(Entity2)双向关系。在@OneTomany关系中,我有@Cascading{Cascade.All}。但是当我在事务或方法中将具有@ManyToOne关系的实体的初始为false的boolean属性更改为true,然后又变回false时,它会导致数据库触发更新查询,将实体的boolean设置为false,这似乎是错

    • 问题内容: 我想要做的就是在我的数据库的用户,但它应该排,一个新行。 Ofcourse我连接到数据库第一和的,并从URL字符串。 可以,但是只添加新行; 这是我尝试过的; 和 和 但是它们都不起作用,我在做什么错? 任何帮助是极大的赞赏! 问题答案: 如果不存在约束,请在您的列上创建约束: 用途: (subs_name, subs_email, subs_birthday) VALUES (?,

    • 问题内容: 我正在尝试在两个SQL Server 2008表之间移动一些数据。如果该记录存​​在于表2中,并且带有来自表1的电子邮件,则使用来自表1的数据更新该记录,否则插入新记录。 在表1中,我有许多列;名字,姓氏,电子邮件等。 我不确定如何构造查询以更新Table2(如果来自Table1的电子邮件存在)或插入新行(如果Table2中不存在来自Table1的电子邮件)。 我尝试在Google上进

    • 我有这样一个df: 其中ID是另一个df的主键和唯一键,该df是此df的源。集群不是密钥,不同的ID通常具有相同的集群值;不管怎么说,这是我必须掌握的信息。 我想获得的是这个数据框: 如果这是不可能的,像这样的字典也可以: 我试过很多方法都没有成功。。似乎无法将列表作为数据帧值插入。。无论如何,我认为以某种巧妙的方式进球应该不会那么困难。。对不起,如果我想不起来了,但我对编码是新手 有什么建议吗?

    • 问题内容: 是否可以在sql中执行更新语句,但仅在更新不同时才执行更新? 例如 如果在数据库中, 不应 执行任何类型的更新 但是,如果 这 应该 执行更新。 问题答案: 使用更新前触发器可以做到这一点。在此触发器中,您可以将旧值与新值进行比较,并在新值不变的情况下取消更新。但这将导致呼叫者网站上的错误。 我不知道为什么要这样做,但是这里有几种可能性: 性能:这里没有性能提升,因为更新不仅需要找到正