JPA - 传递参数以自定义延迟加载外键约束

时间:2016-09-06 03:40:07

标签: entity-framework hibernate jpa spring-boot jpa-2.0

我不知道如何正确地命名这个问题。我有一些实体通过外键约束(ManyToOne和OneToMany)相互连接。所有这些实体都有一个继承的表,其中删除了像"这样的元数据"存储。继承由InheritanceType.JOINED完成。所有外键约束都是延迟加载的。

现在,当我只想查询已删除的实体时,我还希望后续访问实体的外键约束只返回已删除的条目。是否可以将参数deletedOnly传递给查询,以便当开发人员通过延迟加载访问它们时,甚至所有外键约束都会受到影响?

这是一个管理平台,客户可以在其中管理其实体。删除实体是通过delete标志完成的。有时需要恢复已删除的实体。因此,需要一个仅显示未删除实体的视图和一个显示已删除实体的视图。此平台还显示具有可变深度级别的外键约束,这些约束也可能包含已删除的实体。

如果可以的话,我在这里看到一个问题。如果在同一会话中开发人员只想检索已删除的实体,但在应用程序的进一步处理中,他还需要检索未删除的实体,该怎么办?对于约束,如果在查询再次完成后初始化PersistenceBag

示例代码:

实体购物 1:n 实体区域

@Entity
@Table(name = "shop")
public class Shop extends model.Entity {
    private String name;

    private Collection<Area> areas = new ArrayList<Area>();

    @OneToMany(mappedBy = "shop", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    public Collection<Area> getAreas() {
        return areas;
    }

    public void setAreas(Collection<Area> areas) {
        this.areas = areas;
    }

    @NotNull
    @Column(name = "shop_name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

@Entity
@Table(name = "shop_area")
public class Area extends model.Entity {
    private Long id;
    private String name;
    private Shop shop;
    private Collection<Target> targets = new ArrayList<Target>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @NotNull
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
    @NotNull
    @JoinColumn(name = "shop_id")
    public Shop getShop() {
        return shop;
    }

    public void setShop(Shop shop) {
        this.shop = shop;
    }

    @OneToMany(mappedBy = "area", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    public Collection<Target> getTargets() {
        return targets;
    }

    public void setTargets(Collection<Target> targets) {
        this.targets = targets;
    }

}

超级实体:

@javax.persistence.Entity
@Table(name = "entity")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type")
public abstract class Entity {
    private Long id;
    private boolean deleted = false;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "is_deleted")
    public boolean isDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

}

0 个答案:

没有答案