什么是用于在spring数据jpa中创建或更新的Cascade类型

时间:2018-05-14 01:44:52

标签: spring-boot jpa spring-data spring-data-jpa

假设CustomerAccount具有一对多的关系。让我们说一下创建客户信息的新银行账户也会汇总。 要完成此任务,Account实体也会引用Customer对象。

当我坚持Account并且表中已存在Customer时,需要更新或保持不变。如果它不存在,则需要创建客户记录。如何在JPA的Cascade类型的帮助下做到这一点? 如果不可能如何升级这个问题?

帐户实体:

@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;    
}

1 个答案:

答案 0 :(得分:0)

完全答案是JPA规范。

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

在任何情况下,它完全独立于Spring Data,并且仅由JPA定义。所以找一个好的JPA教程并尝试不同的场景。

要解决您在问题更新中发布的代码:

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

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