gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:30:30 26 4
gpt4 key购买 nike

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

在最简单的形式中,表格可能看起来像这样,具有相应的 @Entity 类:

discount_usages

╔════╦══════════════════╦═════════╦════════════╦══════════╦═════╗
║ 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,即所有公共(public)折扣码和他们自己添加/使用的所有私有(private)折扣码。但是,用户应该无法看到其他用户已添加到自己列表中的代码。

2. 用户应该能够在网站 x 上使用代码 y 注册购买。如果是新的 discount_code,则应保存它。使用情况也应保存到 discount_usages 中,如果这是用户第一次使用 discount_code,则应将其保存为新行;如果用户之前使用过该折扣,则应更新该行代码。

注释:

  • (discount_code_id, user_id) 唯一标识 discount_usages 中的一行。
  • 如果每个“私有(private)”discount_code 都保存在每个使用它的客户的单独行中,则也可以将其建模为 @ManyToOne 关系。

问题:

是否可以在不增加大量复杂性的情况下满足这些要求?我的第一次尝试是将以下内容添加到 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);

但是这种情况的复杂性增加得非常快,并且很容易犯编程错误,意外地将私有(private)代码显示给错误的用户。

最佳答案

Is it possible meet these requirements without adding huge amounts of complexity?

我认为你当然可以。

如果您担心 future 的复杂性,您可以使用规范模式 https://www.martinfowler.com/apsupp/spec.pdf

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

  • 所有公共(public)的

  • 他们自己添加/使用的所有私有(private)

有关代码示例,请参见此处:

https://github.com/iluwatar/java-design-patterns/tree/master/specification

关于java - 在 Spring Data JPA/Hibernate 中设计具有访问限制的可选多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57673808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com