我不知道如何正确地命名这个问题。我有一些实体通过外键约束(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;
}
}