Java 在Spring Data JPA/Hibernate中设计具有访问限制的可选多对多关系
我想设计一个简单的折扣代码应用程序,允许用户跟踪他们对折扣代码的使用情况。我已经有一个现有的“公开”折扣代码列表,用户可以使用。然而,用户也应该能够注册使用“私人”折扣代码 在最简单的形式中,表可能看起来像这样,带有相应的Java 在Spring Data JPA/Hibernate中设计具有访问限制的可选多对多关系,java,sql,hibernate,spring-data-jpa,spring-data,Java,Sql,Hibernate,Spring Data Jpa,Spring Data,我想设计一个简单的折扣代码应用程序,允许用户跟踪他们对折扣代码的使用情况。我已经有一个现有的“公开”折扣代码列表,用户可以使用。然而,用户也应该能够注册使用“私人”折扣代码 在最简单的形式中,表可能看起来像这样,带有相应的@Entity类: 折扣\u用法 ╔════╦══════════════════╦═════════╦════════════╦══════════╦═════╗ ║ id ║ discount_code_id ║ user_id ║ last_used ║ num_use
@Entity
类:
折扣\u用法
╔════╦══════════════════╦═════════╦════════════╦══════════╦═════╗
║ 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 ║ ║
╚════╩═══════╩════════════════╩═════════════════╩═════╝
折扣\u代码
╔════╦══════════════════╦═════════╦════════════╦══════════╦═════╗
║ 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.我需要向用户显示所有可用的折扣码
,即他们自己添加/使用的所有公共码和所有私人码。但是,用户应该不能看到其他用户添加到自己列表中的代码
2.用户应该能够从使用代码y的网站x注册购买。如果是新的折扣\u代码
,则应将其保存。使用情况也应保存到discount\u usages
,如果是用户第一次使用discount\u代码
,则应保存到新行;如果用户以前使用过代码,则应更新该行
注意事项:
- (
,discount\u code\u id
)在user\u id
中唯一标识一行discount\u usages
- 如果每个“私有”
都被保存在使用它的每个客户的单独一行中,那么这也可以建模为一种折扣\u代码
关系@manytone
DiscountCode
实体中:
@ManyToOne(optional = true) User ownedByUser;
然后在折扣代码库中
:
@Query("select d from DiscountCode d where d.ownedByUser.id is null
or d.ownedByUser.id = :userId")
findAllByOwnedByUserIdOrOwnedByUserIdIsNull(@Param("userId") Long userId);
但是这种情况的复杂性增加得非常快,而且很容易出现编程错误,从而意外地将私有代码显示给错误的用户
是否有可能在不增加大量复杂性的情况下满足这些要求
依我看,你当然可以
如果您担心将来的复杂性,可以使用规范模式
在您的情况下,您可以编写以下规则:
- 所有公共的
- 所有他们自己添加/使用的私人设备
谢谢,看起来很合身。你能举例说明如何在SpringJPA中实现这一点吗?基于示例代码,类似的实现将添加
boolean isPrivate
和可选的@manytone-User-User
属性到DiscountCode
。然后从数据库中获取所有DiscountCodes
,并使用DiscountSelector
对添加的属性进行过滤。这是相当多的重复,但它可能是值得的?您可以在这里找到使用springjpa
的示例:。添加布尔值isPrivate
似乎是个好主意。我不知道你在哪里看到复制?这种方法会生成更多的代码,但如果不小心将私有代码显示给错误的用户或其他类似的情况,则很难出现编程错误。您是对的,这并没有太多重复,唯一的问题是可以根据折扣使用情况
表推断这两个属性。但这只是一个微不足道的下降;我提到它主要是为了防止你想到一个更具体的更好的方法:)谢谢你的帮助,非常感谢。