Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring Data JPA/Hibernate中设计具有访问限制的可选多对多关系_Java_Sql_Hibernate_Spring Data Jpa_Spring Data - Fatal编程技术网

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
似乎是个好主意。我不知道你在哪里看到复制?这种方法会生成更多的代码,但如果不小心将私有代码显示给错误的用户或其他类似的情况,则很难出现编程错误。您是对的,这并没有太多重复,唯一的问题是可以根据
折扣使用情况
表推断这两个属性。但这只是一个微不足道的下降;我提到它主要是为了防止你想到一个更具体的更好的方法:)谢谢你的帮助,非常感谢。