有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate注释@Where vs@WhereJoinTable

以下java文档

@在哪里

要添加到集合的元素实体或目标实体的Where子句。该子句是用SQL编写的。这里的一个常见用例是软删除

@可接合的

要添加到集合联接表的Where子句。该子句是用SQL编写的。与{@link Where}一样,常见的用例是实现软删除

一般来说,注释可以以相同的方式使用:

|---------------------|-------------------|-------------------|
|                     |@Where             | @WhereTable       |
|---------------------|-------------------|-------------------|
|target elements      |TYPE, METHOD, FIELD|TYPE, METHOD, FIELD|
|---------------------|-------------------|-------------------|
|Retention            |RUNTIME            |RUNTIME            |
|---------------------|-------------------|-------------------|
|properties           |clause             |clause             |
|---------------------|-------------------|-------------------|

结果,我真的很困惑,我应该如何知道我应该为关系字段使用哪个注释。我找不到使用@Where@WhereJoinTable之间的区别。他们两个都可以互相替换,对吗


共 (1) 个答案

  1. # 1 楼答案

    第一个注释应用于目标实体。下面是一个非常简化的伪代码示例:

    @Entity
    public class Role {
        private Long id;
        private boolean enabled;
    }     
    
    @Entity
    public class User {
        @OneToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
        @Where(clause = "enabled = true")
        private Set<Role> roles = new LinkedHashSet<>(0);
    }
    

    因此,只有启用的角色才会从数据库填充到用户中。角色集合

    第二个注释应用于关联表。下面是伪代码中的另一个示例,但现在我们假设关联表并不像第一种情况那样简单:

    @Entity
    public class Role {
        private Long id;
        private boolean enabled;
    }   
    
    @Entity
    public class User {
        @OneToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
        @Where(clause = "enabled = true")
        @WhereJoinTable(clause = "now() between valid_from and valid_until")
        private Set<Role> roles = new LinkedHashSet<>(0);
    }
    
    and association table has validity attributes, something like 
    
    CREATE TABLE USER_ROLE {
        ID NUMBER NOT NULL,
        USER_ID NUMBER NOT NULL,
        ROLE_ID NUMBER NOT NULL,
        VALID_FROM DATETIME,
        VALID_UNTIL DATETIME
    } 
    

    因此,只有已启用且有效的角色才会从数据库填充到用户中。角色集合