gpt4 book ai didi

java - 如何阻止 JPA 存储库投影摘录返回多对多关系的嵌入列表

转载 作者:行者123 更新时间:2023-12-02 04:25:21 27 4
gpt4 key购买 nike

我有两个实体用户和角色。它们彼此之间都有一个 @ManyToMany 关系(以查找与用户关联的角色,反之亦然)。
我对每个项目都有几个投影,并且两个存储库都有一个 excerptProjection。每当我调用获取所有资源 /api/users 时,资源列表都会按预期返回。但是,当我调用特定资源 /api/users/1 时,它有一个其他类型的 _embedded 资源列表。

当我从 RoleRepository 中删除摘录时,调用 /api/users/1 会阻止嵌入的角色出现,但 /api/roles/1显示嵌入用户。

代码

实体:

public class User {
private long id;
private Instant createdAt;
private Instant updatedAt;
private String username;
private String password;
private String firstName;
private String lastName;
private String email;

@Lazy
@JsonIgnore
@Where(clause = NOT_DELETED)
@ManyToMany(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
@JoinTable(
name = "user_role_rel",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
)
private Set<Role> roles = new HashSet<>();
// other stuff omitted
}

public class Role {
private long id;
private Instant createdAt;
private Instant updatedAt;
private String name;
private String description;

@Lazy
@JsonIgnore
@Where(clause = NOT_DELETED)
@ManyToMany(mappedBy = "roles", cascade = CascadeType.DETACH)
private Set<User> users = new HashSet<>();
// other stuff omitted
}

预测:

@Projection(name = "summary", types = { User.class })
public interface Summary {
Long getId();
String getUsername();
String getFirstName();
String getLastName();
String getEmail();
}

@Projection(name = "summary", types = { Role.class })
public interface Summary {
Long getId();
String getName();
String getDescription();
}

存储库:

@RepositoryRestResource( excerptProjection = Summary.class )
public interface UserRepository extends SoftDeleteRepository<User, Long> {}

@RepositoryRestResource
public interface RoleRepository extends SoftDeleteRepository<Role, Long> {}

请求/响应

GET/api/users/1

{
"createdAt": "2019-06-15T10:37:16.280Z",
"updatedAt": "2019-06-15T10:37:16.280Z",
"username": "ironman",
"firstName": "Tony",
"lastName": "Stark",
"email": "tony@starkindustries.com",
"_id": 1,
"_links": {
// omitted
}
}

GET/api/roles/1

{
"createdAt": "2019-06-15T10:37:15.984Z",
"updatedAt": "2019-06-15T10:37:15.984Z",
"name": "ROLE_ADMIN",
"description": "Admin role",
"_id": 1,
"_embedded": {
"users": [
{
"firstName": "Tony",
"lastName": "Stark",
"username": "ironman",
"email": "tony@starkindustries.com",
"id": 1,
"_links": {
// omitted
}
}
]
},
"_links": {
// omitted
}
}

第一个按预期工作,仅显示可见字段。
第二个不断地抛出 _embedded 字段。

如果我将摘录添加到两个存储库(这就是我的意图),那么两个调用都会添加嵌入的列表。

对这些请求中的任何一个应用投影都会阻止嵌入列表的出现,但显然默认情况下不会应用投影。

有什么办法可以阻止这种情况发生吗?

最佳答案

最近我遇到了同样的问题。希望下面的代码能够帮助您解决问题。

 @Configuration
public class RepositoryConfig extends RepositoryRestConfigurerAdapter {

@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.getProjectionConfiguration().addProjection(Summary.class);
}
}

请检查以下网址以了解更多详细信息:

url

关于java - 如何阻止 JPA 存储库投影摘录返回多对多关系的嵌入列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56609975/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com