我正在使用Java,Hibernate,Spring Data以及相当新的技术。 我需要弄清楚如何跳过标记为“已存档”的行。我们的数据库架构师有严格的指导,不会从数据库中删除任何行。
@MappedSuperclass
public class AbstractEntity implements Identifiable<String> {
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy="uuid")
private String id;
private boolean archived; //<----?
}
@Entity
public class Employee extends AbstractEntity {
private String title;
private String fullName;
@ManyToOne
private Department dept;
}
@Entity
public class Department extends AbstractEntity {
private String name;
}
在上面的示例中,任何扩展AbstractEntity的类都不应该返回具有archived == true的行。我的所有域类都将扩展AbstractEntity,所以我想要一个在AbstractEntity.java或某些全局配置中实现的解决方案,这样所有生成的SQL调用都是'where [table]。存档&lt;&gt;真正的“
答案 0 :(得分:0)
@FilterDef(name="activeOnly")
@Filter(name="activeOnly", condition= "archived <> 1")
// assumes that all tables have a numeric column "archived"
// as you can notice, this is a filter at the SQL Level
// (not at the Entity level)
@MappedSuperclass
public class AbstractEntity // ....
我从未使用过Spring Data,但是官方文档的Adding custom behavior to all repositories部分让我相信获取注入EntityManager
并自定义其行为非常容易。打开它并启用过滤器。
Session session = entityManager.unwrap(Session.class);
session.enableFilter("activeOnly");
如果要将过滤器应用于@MappedSuperclass
的所有子类,请使用最新版本的Hibernate。只有3.5及更高版本(请参阅HHH-4332)支持此行为。
此外,还有一个问题,您可能需要重复关联过滤器(请参阅Hibernate Filters on related table with MappedSuperClass)。
如果您还要自定义删除操作,请使用@SQLDelete
标记archived = 1
(请参阅Soft deletes using Hibernate annotations)。但据我所知,这仅适用于映射实体(在@MappedSuperclass
级别无法做任何事情)