假设Customer
和Account
具有一对多的关系。让我们说一下创建客户信息的新银行账户也会汇总。
要完成此任务,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;
}
答案 0 :(得分:0)
完全答案是JPA规范。
但原则上:是的JPA可以处理所有场景:被引用的实体是新的,未更改的或更新的。虽然如果人们不了解JPA实体的生命周期,很容易遇到问题。
在任何情况下,它完全独立于Spring Data,并且仅由JPA定义。所以找一个好的JPA教程并尝试不同的场景。
要解决您在问题更新中发布的代码:
如果客户不存在,映射的cascade = CascadeType.ALL
将负责创建客户。
如果存在,则默认方法是首先加载它并使用该实体。对它的任何更改都将自动保留。