为了账号安全,请及时绑定邮箱和手机立即绑定

在 Spring Data JPA / Hibernate 中设计具有访问限制的可选多对多关系

在 Spring Data JPA / Hibernate 中设计具有访问限制的可选多对多关系

九州编程 2023-06-21 13:37:07
我想设计一个简单的折扣代码应用程序,允许用户跟踪他们对折扣代码的使用情况。我已经有用户可以使用的折扣代码的现有“公共”列表。但是,用户也应该能够注册使用“私人”折扣代码。在最简单的形式中,这些表可能看起来像这样,带有相应的@Entity类:折扣使用情况╔════╦══════════════════╦═════════╦════════════╦══════════╦═════╗║ id ║ discount_code_id ║ user_id ║ last_used  ║ num_uses ║ ... ║╠════╬══════════════════╬═════════╬════════════╬══════════╬═════╣║  1 ║                2 ║       7 ║ 2019-05-01 ║        3 ║     ║║  2 ║                1 ║       4 ║ 2019-07-10 ║        1 ║     ║║  3 ║                3 ║      11 ║ 2019-05-19 ║        2 ║     ║║  4 ║                2 ║      11 ║ 2019-05-01 ║        1 ║     ║║  5 ║                2 ║       6 ║ 2019-07-10 ║        1 ║     ║║  6 ║                1 ║       4 ║ 2019-05-19 ║        2 ║     ║╚════╩══════════════════╩═════════╩════════════╩══════════╩═════╝折扣代码╔════╦═══════╦════════════════╦═════════════════╦═════╗║ id ║ code  ║    website     ║ expiration-date ║ ... ║╠════╬═══════╬════════════════╬═════════════════╬═════╣║  1 ║ t3fj4 ║ somestore.com  ║ 2019-12-31      ║     ║║  2 ║ ds7do ║ otherstore.com ║ 2019-12-31      ║     ║║  3 ║ uw7tp ║ thirdstore.com ║ 2020-03-15      ║     ║╚════╩═══════╩════════════════╩═════════════════╩═════╝要求:1.我需要向用户展示所有可用的discount_codes,即所有公共的和他们自己添加/使用的所有私人的。但是,用户不应该能够看到其他用户添加到他们自己的列表中的代码。2.用户应该能够在网站 x 上使用代码 y 注册购买。如果是新的discount_code,应该保存。用法discount_usages也应保存到,如果是用户第一次使用,则作为新行保存discount_code,或者如果用户以前使用过该代码,则更新行。笔记:( discount_code_id, user_id) 唯一标识 中的一行discount_usages。@ManyToOne如果每个“私有”discount_code都保存在每个使用它的客户的单独行中,则也可以将其建模为关系。问题:是否可以在不增加大量复杂性的情况下满足这些要求?我的第一次尝试是将以下内容添加到DiscountCode实体中:@ManyToOne(optional = true) User ownedByUser;然后在DiscountCodeRepository:@Query("select d from DiscountCode d where d.ownedByUser.id is null         or d.ownedByUser.id = :userId") findAllByOwnedByUserIdOrOwnedByUserIdIsNull(@Param("userId") Long userId);但是这样做的复杂性增加得非常快,而且很容易出现编程错误,不小心将私人代码显示给错误的用户。
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

是否可以在不增加大量复杂性的情况下满足这些要求?

在我看来,你当然可以。

如果您担心未来的复杂性,可以使用Specification pattern 

在您的情况下,您可以编写以下规则:

  • 所有公共的

  • 他们自己添加/使用的所有私人的

查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信