Spring boot spring数据jpa中创建或更新的级联类型是什么

Spring boot spring数据jpa中创建或更新的级联类型是什么,spring-boot,jpa,spring-data,spring-data-jpa,Spring Boot,Jpa,Spring Data,Spring Data Jpa,假设Customer和Account具有一对多关系。比如说,当创建客户信息的新银行帐户也聚合时。 要完成此任务,帐户实体也会引用客户对象 当我保留一个帐户并且客户已经存在于表中时,需要更新或保持不变。如果不存在,则需要创建客户记录。如何借助JPA中的级联类型实现这一点? 如果这是不可能的,如何升级这个问题 账户主体: @Entity @Table(name = "account") public class Account implements Serializable {  

假设
Customer
Account
具有一对多关系。比如说,当创建客户信息的新银行帐户也聚合时。 要完成此任务,
帐户
实体也会引用
客户
对象

当我保留一个
帐户
并且
客户
已经存在于表中时,需要更新或保持不变。如果不存在,则需要创建客户记录。如何借助JPA中的级联类型实现这一点? 如果这是不可能的,如何升级这个问题

账户主体:

@Entity    
@Table(name = "account")    
public class Account implements Serializable {

    private static final long serialVersionUID = 407923973092266323L;    

    @Id    
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "accID")    
    private Integer accountId;        

    @Column(name = "type")    
    private String accType;

    @ManyToOne(cascade = CascadeType.ALL)    
    @JoinColumn(name = "cus_ID")    
    private Customer customer;
            
    @Temporal(value = TemporalType.DATE)    
    @Column(name = "openDate")    
    private Date createDate;

    // Getters & Setters    
}   
客户实体:

@Entity
@Table(name = "customer")
public class Customer implements Serializable {

    private static final long serialVersionUID = 8149369511517077958L;

    @Id    
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "authorID",nullable = false)    
    private Integer cusId;

    @Column(name = "cusName")    
    private String cusName;    

    public Customer(){}

    public Customer(String cusName){this.cusName = cusName}

    // Getter & Setters    
}
AccountDAO:

@Repository    
public class AccountDAO{    

    @Autowired    
    private AccountRepository accrepo;

    public boolean insertAccount(String accType, String cusName, LocalDate createDate) {            

        try{        

            Date date = Date.from(createDate.atStartOfDay(ZoneId.systemDefault()).toInstant());        

            Account acc1 = new Account();    
            acc1.setAccType(accType);    
            acc1.setCreateDate(date);    
            acc1.setCustomer(new Customer(cusName));

            accrepo.save(acc1);

            return true;            

        }catch(Exception ex){ex.printStackTrace();}

    }

    return false;    
}

实际上,完整的答案是JPA规范

但原则上:是的,JPA可以处理所有场景:被引用的实体是新的、未更改的或更新的。尽管如果不了解JPA实体的生命周期,很容易遇到问题

在任何情况下,它都完全独立于Spring数据,并且仅由JPA定义。因此,找到一个好的JPA教程并尝试不同的场景

要解决您在问题更新中发布的代码,请执行以下操作:

cascade=CascadeType。如果客户不存在,映射的所有
都将负责创建客户


如果存在,默认方法是首先加载它并使用该实体。对它所做的任何更改都将自动保留。

您是否尝试过@Cascade(CascadeType.UPDATE)注释?我编辑了您的问题,使其更易于理解,并将其格式化以提高可读性。请检查我没有改变意思。谢谢@jens,它比上一个更棒、更有意义。通过电话编辑问题很难。这是否意味着需要在保存帐户之前合并实体(客户)?比如在保存前检查客户是否退出?不,不。SpringDataJPA将为您做到这一点。只要尝试一下,当你遇到实际问题时,就可以提出新的问题。嗨,我已经用代码更新了。。假设客户A需要创建2个帐户。当我两次调用insertAccount(…)时,它会在customer表中创建两个同名的客户。我只想用两个帐户保存一个客户..每次新客户因为setCustomer(new customer(cusName))而保存时;这是原因吗?在设置客户之前,我是否需要搜索客户?因此,如果我执行以下操作:Peter需要创建活期账户和储蓄账户。为此,我调用如下<代码>插入账户(“保存”、“彼得”、“2018-04-12”)
插入账户(“当前”、“彼得”、“2018-04-12”)在科目表中保存2条记录,在客户表中保存2条记录。为什么是两个客户?我想只救一个顾客