JPA中如何实现级联操作?

在JPA中可以通过cascade属性配置实体关系的级联操作。
cascade属性指定操作“级联”到关联的实体。它的值可以是:

  • NONE:不级联任何操作(默认值)。
  • PERSIST:级联新增操作。
  • MERGE:级联更新操作。
  • REMOVE:级联删除操作。
  • ALL:级联新增、更新和删除操作。

示例:

@Entity
public class User {
    @Id 
    private int id;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Address> addresses;
}  

@Entity 
public class Address {
    @Id 
    private int id;
    @ManyToOne
    private User user;
}

上例配置了User和Address的一对多关系,并且指定了CascadeType.ALL启用全部级联操作。
这意味着:

  • 新增、更新或删除User时,同时会新增、更新或删除关联的Address实体。
  • 新增、更新或删除Address时,会更新User实体的addresses集合。

示例:

User user = new User();
Address address1 = new Address();
Address address2 = new Address();
user.getAddresses().add(address1);
user.getAddresses().add(address2);

em.persist(user);   // 会同时新增user与两个address实体

em.remove(user);   // 会同时删除user与两个address实体 

级联操作的优点:

  1. 简单方便,可以通过操作一端影响关联的实体。
  2. 保证关联实体数据的一致性。