Java JPA与存储在不同数据库中的用户实体的多对多关系 太长,读不下去了
我试图创建一个与存储在不同数据库中的实体(用户)的关系,但我不知道如何在JPA中实现这一点 用例 我正在Spring Boot/JPA中实现一个汽车服务。我已经创建了一个名为Java JPA与存储在不同数据库中的用户实体的多对多关系 太长,读不下去了,java,spring-boot,jpa,join,many-to-many,Java,Spring Boot,Jpa,Join,Many To Many,我试图创建一个与存储在不同数据库中的实体(用户)的关系,但我不知道如何在JPA中实现这一点 用例 我正在Spring Boot/JPA中实现一个汽车服务。我已经创建了一个名为Car的实体/表。一辆车可能有多个车主(用户),一个用户可能拥有多辆车。但是,User表存储在单独的用户服务中 因为这是一个多人关系,我觉得一个JoinTable是合适的。这里的问题是没有要加入的用户表。我只需要将用户的uuid存储在join表中,这样GET方法就可以获取给定用户的所有汽车,或者给定汽车的所有车主 源代码
Car
的实体/表。一辆车可能有多个车主(用户),一个用户可能拥有多辆车。但是,User
表存储在单独的用户服务中
因为这是一个多人关系,我觉得一个JoinTable
是合适的。这里的问题是没有要加入的用户
表。我只需要将用户的uuid存储在join表中,这样GET
方法就可以获取给定用户的所有汽车,或者给定汽车的所有车主
源代码
下面是对Car
实体的一次尝试。删除ForeignKey
约束允许在联接表中创建条目,而不会由于缺少子表而导致错误
@数据
@实体
@表(name=“car”)
@EqualsAndHashCode(callSuper=true)
公车{
@Id@GeneratedValue私有UUID Id;
@许多
@可接合(
name=“车主”,
joinColumns=@JoinColumn(name=“car\u id”),
inverseJoinColumns=@JoinColumn(name=“user\u id”,insertable=false,updateable=false),
foreignKey=@foreignKey(name=“user\u id”,value=ConstraintMode.NO\u CONSTRAINT))
私人用户;
私有字符串模型;
私人双价;
}
以下是JPAJoinTable
所需的用户
实体,但仅用于其ID:
@数据
@实体
@EqualsAndHashCode()
公共类用户{
@Id私有UUID Id;
@多人(mappedBy=“用户”)
@杰索尼奥雷
私家车;
}
将以下模型发送到JPA存储库save()
方法将成功创建连接表中的car和条目:
{
“车型”:“福特T型车”,
“价格”:850.00,
“用户”:[
{“id”:“e048b593-aad9-4285-b3e6-49475ad9bd1d”},
{“id”:“1d0f7b1e-bc36-4b99-80a1-8835779598ca”}
]
}
问题陈述
但是,当我尝试检索属于特定用户ID的所有车辆时:
@Query(
value=“在c.id=co.car\u id上选择*从车c内部加入车主co,其中co.user\u id=:userId”,
nativeQuery=true)
列出findByUserId(UUID userId);
我得到以下错误:
错误:列user1\uID不存在
已解析的[org.springframework.http.converter.httpmessagenetwitableexception:无法写入JSON:无法提取结果集;嵌套的异常为com.fasterxml.jackson.databind.JsonMappingException:无法提取结果集(通过引用链:java.util.ArrayList[0]->Car[“users”])]
如何读取给定用户的车辆列表?我走错方向了吗?我对其他实现持开放态度。正如@vincendep提到的,解决方案是删除
User
实体,并用以下内容替换Car
实体中的users
属性:
@ElementCollection
@CollectionTable(name=“car\u owner”,joinColumns=@JoinColumn(name=“car\u id”))
@列(name=“user\u id”)
私人业主;
这仍将使用car\u owner
join表。可以使用以下型号的多个用户创建汽车:
{
“车型”:“福特T型车”,
“价格”:850.00,
“业主”:[
“32a7967d-8580-418d-b53a-221ed0c52222”,
“a708455c-c37c-4712-a7ce-59c9be5a5eb5”
]
}
您可以按以下用户ID查询汽车(计入@vincendep):
@Query(value=“来自c车,其中:c.owners的ownerId成员”)
列出findByUserId(UUID所有者ID);
它是存储在同一数据库但不同的架构中,还是存储在不同的数据库服务器中?如果它的数据库相同但架构不同,则可以在当前架构中创建一个视图并查询多个架构。但如果它是一个不同的数据库,即使我不是sure@SridharPatnaik用户数据库尚未创建,但我希望使用microservice体系结构,这将要求这两个服务解耦(不同的数据库)。如果用户由另一个服务管理,您的汽车服务中不应该有用户实体。所以只需使用@ElementCollection private Set即可owners@vincendep没错,我需要删除User
实体和JoinTable
。但是我仍然不清楚如何将车主
表和列映射到@ElementCollection
。我们将继续朝这个方向搜索。谢谢此外,查询应该类似于@query(value=“FROM Car c WHERE:owner MEMBER OF c.owner”)列表findByUserId(UUID owner);万分感谢你的帮助@vincendep!这个解决方案要干净得多。我一定会把它添加到我的JPA工具箱中。