Java 来自不同Rest服务的两个模型之间的JPA链接

Java 来自不同Rest服务的两个模型之间的JPA链接,java,rest,jpa,Java,Rest,Jpa,在JPA模型中,两个Rest服务之间的链接应该如何实现? 假设我有一个包含所有用户相关API的用户服务和一个购物车服务,该服务将用户ID保存在购物车模型中。这两个Rest服务位于两个不同的应用程序中,它们不共享它们的数据库和持久性模型 我想有两种选择: 1选项-加载服务中的用户: 此选项将在购物车模型中添加一个临时用户,该用户将由购物车服务加载 @Entity @Table(name="cart") public class Cart { @Column(name="user_id")

在JPA模型中,两个Rest服务之间的链接应该如何实现? 假设我有一个包含所有用户相关API的用户服务和一个购物车服务,该服务将用户ID保存在购物车模型中。这两个Rest服务位于两个不同的应用程序中,它们不共享它们的数据库和持久性模型

我想有两种选择:

1选项-加载服务中的用户: 此选项将在购物车模型中添加一个临时用户,该用户将由购物车服务加载

@Entity
@Table(name="cart")
public class Cart {

    @Column(name="user_id")
    private Long userId;

    @Transient
    private User user;
}

public class CartService {

    public Cart findById(final Integer id) {
        Cart cart = // Find cart by id in local repository
        loadUser(cart);
        return cart;
    }

    private User loadUser(cart) {
        User user = // Rest API call to get User from Service by ID
        cart.setUser(user);
    }
}
2选项-要加载的自定义注释(如果可能,请惰性加载)用户: 此选项将提供自定义注释以加载用户。我还不知道如何做到这一点,可能是使用过滤器或AOP。 使用此选项,我可以将用户ID设置为私有,并通过user set和get方法添加一些操作

@Entity
@Table(name="cart")
public class Cart {

    @Column(name="user_id")
    private Long userId;

    @UserService(lazy = true)
    @Transient
    private User user;
}

第二个选项更干净,更易于重用和维护,但需要对如何构建它进行一些研究。

为什么不在购物车和用户之间使用aManyToOne(或OneToOne)关联呢?我从来没有将JPA与rest服务一起使用过,但是当使用多个表时,一个表引用另一个表的ID,我使用类似于
@JoinColumn(name=“repo\u id”,nullable=false,foreignKey=@foreignKey(name=“repository\u key”)
的方法来注释
存储库
字段<代码>存储库是一个带有
@Id
-注释字段的实体。在您的示例中,购物车表中有
user\u id
,外键约束将命名为
user\u key
或其他名称。感谢您的评论。他们有不同的休息服务。用户模型位于用户服务中,可通过“/User/{id}”端点访问。购物车模型位于购物车服务中,不知道用户存储在何处或如何存储。您的意思是这两个rest服务位于两个不同的应用程序中,它们不共享其数据库和持久性模型?如果是这样,我将在服务级别执行此操作,而不会使用瞬态字段。在实体中混合使用分离的、可为空的数据和托管状态是理解和维护的噩梦。使用包含购物车状态和用户状态的专用对象。@JBNizet,谢谢您的评论。情况就是这样,我把它添加到问题中进行澄清。您是否建议添加一个额外的类来保存状态?管理这种状态会不会增加复杂性?为什么不在购物车和用户之间使用aManyToOne(或OneToOne)关联呢?我从来没有在rest服务中使用过JPA,但是当使用多个表时,一个表引用另一个ID为的表,我会使用类似于
@JoinColumn(name=“repo\u ID”的东西,nullable=false,foreignKey=@foreignKey(name=“repository\u key”)
注释
存储库
字段<代码>存储库是一个带有
@Id
-注释字段的实体。在您的示例中,购物车表中有
user\u id
,外键约束将命名为
user\u key
或其他名称。感谢您的评论。他们有不同的休息服务。用户模型位于用户服务中,可通过“/User/{id}”端点访问。购物车模型位于购物车服务中,不知道用户存储在何处或如何存储。您的意思是这两个rest服务位于两个不同的应用程序中,它们不共享其数据库和持久性模型?如果是这样,我将在服务级别执行此操作,而不会使用瞬态字段。在实体中混合使用分离的、可为空的数据和托管状态是理解和维护的噩梦。使用包含购物车状态和用户状态的专用对象。@JBNizet,谢谢您的评论。情况就是这样,我把它添加到问题中进行澄清。您是否建议添加一个额外的类来保存状态?管理这种状态会不会增加复杂性?