数据库正在创建对象的多行
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;
我知道数据库需要一个 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;