Hibernate @Where 未在 @MappedSuperClass 实体中强制执行

Posted

技术标签:

【中文标题】Hibernate @Where 未在 @MappedSuperClass 实体中强制执行【英文标题】:Hibernate @Where is not enforcing at @MappedSuperClass Entity 【发布时间】:2014-11-17 03:16:26 【问题描述】:

为了从 eclipse 链接迁移到 hibernate,我正在寻找相当于 eclipse 链接注释 @AdditionalCriteria 在 Hibernate 中的 @MappedSupperClass BaseEntity 级别,以过滤从扩展此 BaseEntity 的所有实体中逻辑删除的记录。

我找到了@Where 注释。但是,这仅适用于Entity 级别,不适用于 BaseEntity。请让我知道是否有可能添加此注释或任何其他 Hibernate 注释以过滤 BaseEntity

@MappedSuperclass
@Where(clause = "DEL_IND = 0")  // DOES NOT WORK
public abstract class BaseEntity implements Serializable 

    private static final long serialVersionUID = 1L;

    @Column(name = "DEL_IND")
    private boolean deleted = Boolean.FALSE;

    public boolean getDeleted() 
        return deleted;
    

    public void setDeleted() 
        this.deleted = Boolean.TRUE;
    




@Entity
@Table(name = "PERSON")
@Where(clause = "DEL_IND = 0")  // THIS WORKS BUT NEEDS TO BE REPEATED IN ALL ENTITIES
public class Person extends BaseEntity implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "PERSON_ID")
    private Integer id;

    @Column(name = "LAST_NAME")
    private String lastName;

    @Column(name = "FIRST_NAME")
    private String firstName;

    --------------------
    getters & setters
    --------------------
    --------------------

【问题讨论】:

【参考方案1】:

您可以为此打开一个 Hibernate JIRA 问题。唯一的解决方法是手动将@Where 注释添加到您的所有实体或使用过滤器。

使用过滤器,您可以选择动态启用/禁用它们,这很有用,因为您有时可能想要获取已删除的项目。

【讨论】:

以上是关于Hibernate @Where 未在 @MappedSuperClass 实体中强制执行的主要内容,如果未能解决你的问题,请参考以下文章

hibernate之主键生成策略

HIbernate 一对一注释未在依赖表中生成外键 GerericGenerator

在 WHERE 子句中使用连接列时,Mysql 未在 LEFT JOIN 中使用索引

Hibernate @Where 注释语法问题

Hibernate在超类中定义@Where注解

Hibernate @Where 子句在 HSQL 和 MySQL 之间不一致