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

我想设计一个简单的折扣代码应用程序,允许用户跟踪他们对折扣代码的使用情况。我已经有用户可以使用的折扣代码的现有“公共”列表。但是,用户也应该能够注册使用“私人”折扣代码。


在最简单的形式中,这些表可能看起来像这样,带有相应的@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_iduser_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);

但是这样做的复杂性增加得非常快,而且很容易出现编程错误,不小心将私人代码显示给错误的用户。


九州编程
浏览 59回答 1
1回答

HUH函数

是否可以在不增加大量复杂性的情况下满足这些要求?在我看来,你当然可以。如果您担心未来的复杂性,可以使用Specification pattern 在您的情况下,您可以编写以下规则:所有公共的他们自己添加/使用的所有私人的
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java