数据库正在创建对象的多行

Database is creating multiple rows of the object

我知道数据库需要一个 compareTo 方法来理解这些是相同的对象,所以我为以下对象编写了一个 compareto 方法

@JsonIgnoreProperties(ignoreUnknown = true)
@Entity
@Table(name = "networkServiceConfig")
public class NetworkServiceConfig implements Serializable{

    String endpoint;
    String url;
    String host;
    int port;
    String networkServiceName;
    String uuid;

    @JsonIgnore
    @OneToOne(mappedBy="networkServiceConfig")
    Service service;

    private static final long serialVersionUID = 1L;
    @JsonProperty
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long id;

    public NetworkServiceConfig() {

    }

    public NetworkServiceConfig(String endpoint, String url, String host, int port, String networkServiceName) {
    this.endpoint = endpoint;
    this.url = url;
    this.host = host;
    this.port = port;
    this.networkServiceName = networkServiceName;
    }



    public String getEndpoint() {
    return this.endpoint;
    }

    public void setEndpoint(String endpoint) {
    this.endpoint = endpoint;
    }

    public String getUrl() {
    return this.url;
    }

    public void setUrl(String url) {
    this.url = url;
    }

    public String getHost() {
    return this.host;
    }

    public void setHost(String host) {
    this.host = host;
    }

    public int getPort() {
    return this.port;
    }

    public void setPort(int port) {
    this.port = port;
    }

    public void setNetworkServiceName(String name) { 
    this.networkServiceName = name;

    }

    public String getNetworkServiceName() {
    return this.networkServiceName;
    }

    public String getUuid() {
    return this.uuid;
    }

    public void setUuid(String uuid) {
    this.uuid = uuid;
    }

    /**
     * Implement comparable to compare two NetworkServiceConfig objects for equality
     */
    public int compareTo(NetworkServiceConfig o) {
    if (o == null) {
        return 1;
    }

    if (this.networkServiceName.equals(o.networkServiceName)) {
        return 0;
    }

    int value = (int) (this.id - o.id);

    if (value == 0) {
        return this.networkServiceName.compareTo(o.networkServiceName);
    }

    return value;
    }

    @Override
    public boolean equals(Object obj) {
    NetworkServiceConfig o = (NetworkServiceConfig) obj;
    return this.networkServiceName.equals(o.networkServiceName);
    }




}

每个对象的网络服务名称都是唯一的。但是当我通过各种 save 调用保存这个对象时,我看到每次创建 20 行。请注意,因此我们在不同的对象上使用 属性 这是关系

服务对象:

 @OneToOne (cascade= CascadeType.ALL)
    @JoinColumn(name="networkServiceConfig_id")
    @JsonProperty
    NetworkServiceConfig networkServiceConfig;

此外,我在 table

中没有看到 networkServiceConfig_id 列

我觉得你有点困惑,Java的compare to或comparable implementations在你使用Collections Framework时用于排序对象,但它与Hibernate的数据库实现没有直接关系或 JPA

最好的方法是在保存和更新 NetworkServiceConfig 和 return 422 HTTP 状态之前检查 networkServiceConfig table 是否有 networkServiceName 重复项,如果 networkServiceName 已经存在。做这样的更新检查有点棘手。

除此之外,您还应该按照@xiaofeng.li 的建议在数据库级别添加保护。您可以为 networkServiceName 添加唯一约束或将该字段作为主键。

如果您使用 NetworkServiceConfig 作为参考 table,您应该删除 cascade= CascadeType.ALL。你也应该使用 @ManyToOne 并从 NetworkServiceConfig 中删除 Service 关联,如果多个 Service 可以具有相同的 NetworkServiceConfig

 @ManyToOne
 @JoinColumn(name="networkServiceConfig_id")
 @JsonProperty
 NetworkServiceConfig networkServiceConfig;