我拥有的两个实体:Country
和User
@Entity(name = "Country")
@Table(name = "countries")
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true)
private List<User> users = new ArrayList<>();
}
@Entity(name = "User")
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean removed;
}
实体User
有一个属性,removed
类型为boolean
,我们需要跳过/忽略所有removed
等于true
的User
。
Hibernate是否提供了任何合适的机制来实现我的目标?
p。S:谷歌说,潜在的我可以使用注释:@JoinColumn
,@JoinColumnOrFormula
,但根据我读过的文档,上面提到的注释属于@ManyToOne
场景,在我的特殊情况下,我有@OneToMany
关系。
对于hibernate,在实体上使用@Where
应该可以达到目的。这将阻止任何将已移除标志设置为true
的用户被加载。您可以在hibernate文档
中找到更多信息。如果您只希望它在集合上,则可以在关系
上添加注释。@Entity(name = "Country")
@Table(name = "countries")
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true)
@Where( clause = "removed = false" ) // <- here
private List<User> users = new ArrayList<>();
}
或者,如果您根本不想加载任何已删除的用户,则可以将注释添加到类中。
@Entity(name = "User")
@Table(name = "users")
@Where( clause = "removed = false" ) // <- here
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean removed;
}
需要注意的是,我还没有使用过这种方法,但我认为,如果你有其他实体链接到一个将标志设置为true的用户,你需要更新注释以允许为空。
例如,想象一个电子商务网站,一个订单链接到一个用户。加载链接到已删除用户的订单将失败,或者您可以修改注释,使其返回具有null
用户的订单。我希望这是有意义的!