Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Hibernate JPA事务类中不必要的用户类_Hibernate_Spring Boot_Rest_Spring Mvc_Jpa - Fatal编程技术网

Hibernate JPA事务类中不必要的用户类

Hibernate JPA事务类中不必要的用户类,hibernate,spring-boot,rest,spring-mvc,jpa,Hibernate,Spring Boot,Rest,Spring Mvc,Jpa,用户类 @Entity class User { @OneToMany List<Order> orders; } @Entity class Order { @ManyToOne User user; @OneToOne Transaction transaction } @Entity class Transaction { @OneToOne Order order; @ManyToOne

用户类

@Entity
class User {
    @OneToMany
    List<Order> orders;
}
@Entity
class Order {   
    @ManyToOne
    User user;

    @OneToOne
    Transaction transaction 
}
@Entity
class Transaction {
    @OneToOne
    Order order;

    @ManyToOne
    User user; // Do you think this is necessary?

    void makeTransaction(long orderId){
        //Here I can easily get user object using orderId, right?
    }
}
交易类别

@Entity
class User {
    @OneToMany
    List<Order> orders;
}
@Entity
class Order {   
    @ManyToOne
    User user;

    @OneToOne
    Transaction transaction 
}
@Entity
class Transaction {
    @OneToOne
    Order order;

    @ManyToOne
    User user; // Do you think this is necessary?

    void makeTransaction(long orderId){
        //Here I can easily get user object using orderId, right?
    }
}
我刚开始冬眠。在我的项目中,我不明白为什么用户属性被添加到事务类中,而我无论如何都要通过Order对象获取用户对象


那么,上述事务类设计是否错误?或者以后会产生任何问题?

这取决于您的业务需求和业务需求

乍一看,它似乎是完全冗余的(在数据库(redundank FK)和OO端(冗余引用)

但这里并没有告诉我订单中的用户和交易中的用户实际上是相同的

正如你所解释的,它“看起来”是一样的,但我个人不知道。所以,如果两个用户都可以“不同”,这个模型可以工作

现在,如果我们假设用户在这两个概念上总是相同的,并且您有这样一个用例:
根据特定用户“拥有”的某些标准(时间戳、优先级等)加载事务
在事务中没有任何“用户”信息的情况下,您必须遍历他的所有订单,并过滤/恢复您需要的事务。
有了内部的用户信息,您可以直接访问事务表(甚至可以避免急切地加载
订单
,或者只使用投影DTO)

现在,您可以在
User
上保留一个lightweigt引用:
private Long userId
而不是
hard reference
,从而降低循环依赖性问题的风险

现在请记住->这仍然是冗余。

在关系建模中,当您在模型上应用一些非规范化时,冗余就发生了,有时它只是必需的(性能方面,用例需要,投影需要…)


如果您有意识并同意这一点,则可以。只需注意可能发生的一致性问题,并准备好处理该属性。

这取决于您的业务需求和业务需求

乍一看,它似乎是完全冗余的(在数据库(redundank FK)和OO端(冗余引用)

但这里并没有告诉我订单中的用户和交易中的用户实际上是相同的

正如你所解释的,它“看起来”是一样的,但我个人不知道。所以,如果两个用户都可以“不同”,这个模型可以工作

现在,如果我们假设用户在这两个概念上总是相同的,并且您有这样一个用例:
根据特定用户“拥有”的某些标准(时间戳、优先级等)加载事务
在事务中没有任何“用户”信息的情况下,您必须遍历他的所有订单,并过滤/恢复您需要的事务。
有了内部的用户信息,您可以直接访问事务表(甚至可以避免急切地加载
订单
,或者只使用投影DTO)

现在,您可以在
User
上保留一个lightweigt引用:
private Long userId
而不是
hard reference
,从而降低循环依赖性问题的风险

现在请记住->这仍然是冗余。

在关系建模中,当您在模型上应用一些非规范化时,冗余就发生了,有时它只是必需的(性能方面,用例需要,投影需要…)


如果您有意识并同意这一点,则可以。只需注意可能发生的
一致性
问题,并准备好处理该属性。

不要认为这是必要的,因为事务直接链接到订单,而不是用户。您将以这种方式访问事务(用户->订单->事务)但不是相反。即使不添加用户,也可以通过Transaction.getOrder().getUser()将用户链接到事务。因此,认为再次链接事务和用户是多余的。不要认为这是必要的,因为事务直接链接到订单而不是用户。您将通过这种方式访问事务(用户->订单->事务)但不是相反。即使不添加用户,也可以通过Transaction.getOrder().getUser()将用户链接到事务。所以,我认为再次链接事务和用户是多余的。嗨,首先,谢谢你的回答。我得到了你的观点。但最后,我感到困惑…我应该将用户保留在事务类中吗?对于上述场景,你会怎么做。你会将该用户保留在事务类中吗?如果你能告诉我你对事务类的看法,我会很高兴的这里也是线程:正如我所说的是同一个用户吗?如果是的话…你在你的用例中需要这种冗余吗?如果是的话,只通过“id”保留少量引用是可以接受的吗?…回答这些问题,你就会知道怎么做;-)好的…订单取决于用户,交易取决于订单,所以间接地说是的,对于相同的交易和订单,它是相同的用户。对于UI,我有一个DTO(比如TransactionDTO),所以在TransactionDTO中,我已经有了UserDTO来显示UI的Rest响应。我的查询只与DB相关,而不是UI大小写..仅供参考(比如一对一或多对一关系),我们通常只将其称为类,而不是id…(它可以是DTO或模型类)所以,我可以删除事务类中的用户依赖项,对吗?嗨,首先,谢谢你的回答。我得到了你的观点。但最后,我很困惑…我应该将用户保留在事务类中吗?对于上述场景,你会怎么做。你会将该用户保留在事务类中吗?如果你能告诉我你对此的看法,我将很高兴这里也有广告:正如我所说的是同一个用户吗?如果是的话…你在你的用例中需要这种冗余吗?如果是的话,只通过“id”保留少量引用是可以接受的…回答这些问题,你就会知道该做什么;-)好的…订单取决于用户,交易取决于订单,所以