0

我正在使用 Hibernate 的 JPA 实现。我有一个包含不同类型用户(私人|公共等)的用户表,user_type 列指定用户的类型。

我有一个用户类,它是一个代表用户表的实体。我添加了

@DiscriminatorColumn(name="user_type", discriminatorType=DiscriminatorType.STRING) 

在我的用户类上创建了 2 个类,PrivateUser 和 PublicUser,每个类都使用相应的 @DiscriminatorValue 扩展用户类。

我还有 PrivateCompany 和 PublicCompany 表,它们分别使用用户表中名为 company_id 的列具有一对多关系 PrivateUser 实体和 PublicUser 实体。我在两个 OneToMany 关系上也有级联删除。

现在,如果我有一个 ID 为 10 的 PrivateCompany 和一个 ID 为 10 的 PublicCompany ,并且 PrivateCompany 和 PublicCompany 的用户表中的用户条目如下所示。

user_id | company_id | user_type
100       10           private
101       10           public

如果我删除 PrivateCompany,我最终会删除用户 101 和 100,因为 company_id 上的 OneToMany 关系并且它不考虑 user_type 列,尽管它被提及为 DiscriminatorColumn。我正在寻找一种方法来提供级联删除功能,该功能在删除子项时考虑 DiscriminatorColumn。我尝试创建具有多个列的 JoinColumns,但我可以创建与列名而不是列值的关系(这是我的情况)。

如果我的解释不清楚,请告诉我。

提前致谢

4

2 回答 2

0

据我了解,您的Company实体 (PublicCompanyPrivateCompany) 映射到两个不同的表。如果是这样,那么我还假设每个公司都有一个列表User,而不是PrivateUseror PublicUser。如果一切都正确,那么您必须:

  1. 要么删除级联并手动处理。
  2. 在您的公司实体中更改列表/集合的类型:而不是Collection<User>您需要Collection<PrivateUser>在 PrivateCompany 和Collection<PublicUser>PublicCompany 中。

或者,为什么不简单地将 PrivateUser 和 PublicUser 合并到一个实体中 + 与 Company 实体相同并区分逻辑中的类型?

于 2014-01-06T20:33:20.563 回答
0

我想通了,在 PrivateUser 类上添加注释@SQLDelete,如下所示

@SQLDelete( sql="delete user WHERE private_company_id = ? and rel_type = 'private'")
public class PrivateUser extends User {

}

这样我可以在 PrivateCompany 和 PrivateUser 的 OneToMany 关系上添加级联删除,但是当级联启动时,它会执行 SQLDelete 注释中提到的查询,让您控制。如果您想将记录标记为非活动而不是删除它,也可以使用此方法。

参考:覆盖 JPA/Hibernate 中的默认 remove()/DELETE

于 2014-01-06T22:56:20.180 回答