在连接表中过滤行 - 在Hibernate中有多对多

时间:2016-06-23 20:24:59

标签: java spring hibernate jpa spring-boot

我正在尝试在整个平台上实现软删除。每个表都有一个deleted_on列,用于过滤掉已删除的行。

这包括我在文件和用户之间的连接表。我没有找到任何有用的东西。现在我的课程看起来像这样

@Entity
public class File {

    @ManyToMany
    @JoinTable(
        name = "file_user",
        joinColumns = @JoinColumn(name = "file_id", referencedColumnName = "file_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
    )
    private List<User> users;

    // Constructor and other fields
}

用户类:

@Entity
public class User {

    @ManyToMany(mappedBy = "users")
    private List<FileData> files = new ArrayList<>();

    // Constructor and other fields
}

如果可能,我希望能够运行以下代码而不在业务代码中过滤它

File file = fileRepository.findOne(fileKey);
file.getUsers().remove(user);
fileRepository.save(file);

1 个答案:

答案 0 :(得分:4)

如果您是Hibernate作为JPA提供商,那么您可以使用@Where注释

@Entity
@Where(clause="deleted_on=1")
public class User {

    @ManyToMany(mappedBy = "users")
    private List<FileData> files = new ArrayList<>();

    // Constructor and other fields
}

这将在所有用户类

的查询中应用where子句

附加说明:

您需要在所有关系中再次指定@where子句

@ManyToMany
    @JoinTable(
        name = "file_user",
        joinColumns = @JoinColumn(name = "file_id", referencedColumnName = "file_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
    )
@Where(clause="deleted_on=1")
    private List<User> users;