spring-data-jpa 基于条件保持@多对一关系

y1aodyip  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(155)

假设我们有一个Employee实体,这个实体有一个自反关系(与自身的关系)。关系的类型是@ManyToOneMap,意思是,多个Employee只受一个“Boss”(也是Employee)的监督。Employee实体也与Company实体有关系。
多个员工只为一家公司工作(@ManyToOne),而一家公司认识他的老板(@OneToOne)

问题:

我们如何基于条件(标准)持久化这种@ManyToOne和@OneToOne关系?只有当他们在同一家公司工作时,我们才能将Boss分配(持久化)给Employee。只有当Employee是老板(意味着他没有主管(NULL))时,我们才能将Employee分配到一家公司。
我想有很多解决方案,比如使用@Query,@ Prepersistent,@Filter,在服务中进行检查,但是如何以及哪一种更适合这种情况。

6psbrbz9

6psbrbz91#

可通过以下方式实现:

@Entity
public class A implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @ManyToOne
    private A parent;
    @OneToMany(mappedBy="parent")
    private Collection<A> children;

    // Getters, Setters, serialVersionUID, etc...
}

要检查这些关系,请使用驱动程序代码MainApplication.java

public static void main(String[] args) {

    EntityManager em = ... // from EntityManagerFactory, injection, etc.

    em.getTransaction().begin();

    A parent   = new A();
    A son      = new A();
    A daughter = new A();

    son.setParent(parent);
    daughter.setParent(parent);
    parent.setChildren(Arrays.asList(son, daughter));

    em.persist(parent);
    em.persist(son);
    em.persist(daughter);

    em.getTransaction().commit();
}

如果我在这两个注解上都设置了cascade=CascadeType.ALL,我就可以安全地持久化其中一个实体而忽略其他实体。假设我在事务中持久化了parent。JPA实现遍历parent的children属性,因为它用CascadeType.ALL标记。JPA实现在那里找到son和daughter。然后它代表我持久化这两个子实体,即使我没有显式地请求它。

相关问题