gpt4 book ai didi

java - Hibernate + Json + 字符串数组

转载 作者:行者123 更新时间:2023-11-30 07:39:56 24 4
gpt4 key购买 nike

我有下表客户、角色、客户角色。客户和角色具有长 PK,而 CustomerRoles 显然执行多对多映射。将 Roles 表视为由系统定义的固定表(但不是硬编码的)。 IE。表驱动的“枚举”。 IE。 “管理员”、“用户”等

在 Java 方面,我有一个 Customer 实体和一个 RoleEntity,我正在使用 Hibernate/JPA 进行映射。

现在一切正常,但我最终得到的 Json 看起来像这样:

{
"customerId": 100000,
"firstName": "Bob",
"lastName": "Jenkins",
"roles": [
{
"name": "Admin"
},
{
"name": "Super User"
}
]
},

我真正想要的是它看起来像:

"roles": [ "Admin", "Super User" ]

并在内部通过使用 ID 的 M2M 表对其进行 FK。请注意,roleid 字段设置为 json ignore,但它仍然保留为对象数组而不是字符串数组。

显然,字符串需要针对 Roles 表中的内容进行强制执行。

有什么建议吗?

客户实体:

@ApiModelProperty(notes="Id of the customer.", required=true, value="100000")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@JsonProperty(access=Access.READ_ONLY)
private Long customerId = 0L;
@NotNull
@Size(min=2, max=64)
@ApiModelProperty(notes="First name of the customer.", required=true, value="John")
private String firstName;
@NotNull
@Size(min=2, max=64)
@ApiModelProperty(notes="Last name of the customer.", required=true, value="Smith")
private String lastName;
@ManyToMany(cascade={ CascadeType.PERSIST })
@JoinTable(name="CustomerRoles",
joinColumns={ @JoinColumn(name="CustomerId") },
inverseJoinColumns={ @JoinColumn(name="RoleId") }
)
private List<Role> roles = new ArrayList<>();

public Long getCustomerId() {
return this.customerId;
}

public String getFirstName() {
return this.firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return this.lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public List<Role> getRoles() {
//return new ArrayList<Role>(this.roles);
return this.roles;
}

角色实体:

@ApiModelProperty(notes="Id of the role.", required=true, value="1")
@Id
//@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long roleId;
@NotNull
@Size(min=2, max=64)
@ApiModelProperty(notes="Name of the role.", required=true, value="Admin")
private String name;

@JsonIgnore
public Long getRoleId() {
return this.roleId;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

最佳答案

在您的 Customer 实体中添加一个新方法

    @JsonProperty("roles")
public List<String> getRolesAsStrList() {
return this.roles
.stream()
.map(Role::getName)
.collect(toList());
}

然后在角色属性上添加@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)

    //other annotations
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private List<Role> roles = new ArrayList<>();

对于 POST 自动从 String 绑定(bind)到 Role 只需在 Role.java 中添加两个构造函数

    public Role() {
}

public Role(String name) {
this.name = name;
}

这将像这样自动处理负载并创建两个角色实体,名称分别为“Admin”和“Super User”。

{
"customerId": 100000,
"firstName": "Bob",
"lastName": "Jenkins",
"roles": [ "Admin", "Super User"]
}

但是,如果您需要角色的 id 字段,则需要在持久化之前手动处理它,或者您可以将角色名称作为外键保留在 CustomerRoles 表中,假设角色名称是唯一的。

如果您需要更高级的序列化或反序列化,您可以编写自定义JsonSerializerJsonDeserializer。参见 JsonComponent如果您使用 spring boot 来为您的 api 提供服务。

关于java - Hibernate + Json + 字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58674070/

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