超越默认提取以跳过具有特定值的行

时间:2014-02-28 00:46:44

标签: java hibernate jpa spring-data-jpa

我正在使用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;真正的“

1 个答案:

答案 0 :(得分:0)

看看Hibernate Filters

@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级别无法做任何事情)