spring存储库saveall为Map实体插入重复行

mctunoxg  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(342)

我试图插入一个与另一个实体有一对一关系的实体列表。对于许多父实体,一对一Map对象可能是相同的。我希望在父对象的外键中引用相同的子实体,但实际上会创建重复的行。这里是我的实体。

@Builder
@Entity
   public class PaymentInfoType1 {
        @Id
        Long id;
        LocalDate date;
        @Column(precision = 15, scale = 2)
        BigDecimal amount;
        String reference;
        @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
        @JoinColumn(name = "account", referencedColumnName = "id")
        Account account;
    }

    @Builder
    @Entity
    @EqualsAndHashCode(onlyExplicitlyIncluded = true)
    public class Account {
        @Id
        Long id;
        @EqualsAndHashCode.Include
        String name;
        @EqualsAndHashCode.Include
        String accountId;
    }

我正在根据从不同系统收到的信息创建paymentinfotype1列表。每个paymentinfotype1都会与其帐户一起创建,该帐户可能具有完全相同的信息,但实时对象不同。
当我这样做时:

PaymentInfoType1 first = // Created with some logic
Account account1 = // name = sample & accountId = 123
first.setAccount(account1);

PaymentInfoType1 second = // Created with some logic
Account account2 = // name = sample & accountId = 123
second.setAccount(account2);

// Both the above its own account object but the field have exactly same values.

List<PaymentInfoType1> list = List.of(first, second);
repo.saveAll(list);

我原以为paymentinfotype1表中有两行,account中有一行,但发现account也有两行。在这种情况下,看起来像equals和hashcode没有任何效果。
当Map对象按equals/hashcode相似时,如何处理此问题以不插入重复行。

2eafrhcq

2eafrhcq1#

jpa对这件事一无所知 @EqualsAndHashcode (这只是生成类方法 equalshashCode ).
jpa通过带注解的实体id标识实体 @Id (或 @EmebeddedId )这个id也是可以在数据库级别实现和检查的,通常也可以生成(比如一些db序列)。
如果你想用 Account 鉴定人 nameaccountId 在jpa方面,您需要使用 @EmbeddedId@Embeddable 摆脱 @Id . 这将类似于:

@Embeddable
public class AccountId {
    String name;
    String accountId; // maybe needs renaming...
}

然后在 Account :

@EmbeddedId
AccountId accountId;

看看这个例子

相关问题