【问题标题】:How to update fields of an EmbeddedID in Spring JPA如何在 Spring JPA 中更新 EmbeddedID 的字段
【发布时间】:2018-09-05 11:22:25
【问题描述】:

我有一个可嵌入的 RecordId 类,并在 Record 类中作为 EmbeddedId 引用。 RecordId 具有版本和日期字段。在记录更新操作期间,我必须更新 RecordId 的字段,即版本。我正在使用下面的代码来做到这一点。

existingRecord.getRecordId().setVersion(recordData.getRecordId().getVersion());
recordRepository.save(existingRecord);

但是数据库中的数据没有得到更新。

EmbeddedId 的字段更新是否有限制。

// Embeddable class

@Embeddable
public class RecordId implements Serializable{
/**
 * 
 */
private static final long serialVersionUID = 8167040004250354298L;

@Column(name="Record_DOMAIN", nullable = false)
@NotNull(message = "Record Domain cannot be empty")
@JsonProperty("RecordDomain")
private String recordDomain;

@Column(name="ENVIRONMENT_TYPE", nullable = false)
@NotNull(message = "Environment Type cannot be empty")
@Enumerated(EnumType.STRING)
@JsonProperty("environmentType")
private EnvironmentTypes environmentType;

@Column(name="UPGRADE", nullable = false)
@JsonProperty("upgrade")
private boolean upgrade;

@Column(name="VERSION", nullable = false)
@JsonProperty("version")
private String version = "2.0";

@ApiModelProperty(value = "Enironment type for which the Record Domain is 
created.", required = true )
public EnvironmentTypes getEnvironmentType() {
    return environmentType;
}

public void setEnvironmentType(EnvironmentTypes environmentType) {
    this.environmentType = environmentType;
}

@ApiModelProperty(value = "Cusotmer Domain name", required = true )
public String getRecordDomain() {
    return recordDomain;
}

public void setRecordDomain(String recordDomain) {
    this.recordDomain = recordDomain;
}


public RecordId(){
}

public RecordId(String recordDomain, EnvironmentTypes environmentType){
    this.recordDomain = recordDomain;
    this.environmentType = environmentType;
}

public RecordId(String recordDomain, EnvironmentTypes environmentType, 
boolean upgrade, String version){
    this.recordDomain = recordDomain;
    this.environmentType = environmentType;
    this.upgrade = upgrade;
    this.version = version;
}

public boolean isUpgrade() {
    return upgrade;
}

public void setUpgrade(boolean upgrade) {
    this.upgrade = upgrade;
}

public String getVersion() {
    return version;
}

public void setVersion(String version) {
    if( version != null) {
        this.version = version;
    }else {
        this.version = "18.2";
    }
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof RecordId)) return false;
    RecordId that = (RecordId) o;
    return Objects.equals(getRecordDomain(), that.getRecordDomain()) &&
            Objects.equals(getEnvironmentType(), 
    that.getEnvironmentType());
}

@Override
public int hashCode() {
    return Objects.hash(getRecordDomain(), getEnvironmentType());
}

}

Record Class with Embedded Id,它使用上述可嵌入类作为复合键。

@Entity
@Table(name="RECORD_DATA") 
public class Record implements Serializable{

private static final long serialVersionUID = 1L;

@EmbeddedId
private RecordId recordId;

public RecordId getRecordId() {
    return recordId;
}

public void setRecordId(RecordId recordId) {
    this.recordId = recordId;
}

public Record() {
}

public Record(RecordId recordId) {
    this.recordId = recordId;
}
}

带有 Record 类的 JPA 存储库接口。

// JPA Repository
public interface RecordRepository extends JpaRepository<Record, RecordId>{
}

【问题讨论】:

  • 请提供您正在尝试保存的实体和@Embeddable 类。
  • 添加了我与 Embeddable 类一起保存的实体。
  • 你可以尝试将默认构造函数添加到RecordId.class。 --> public RecordId() {}
  • 它已经在那里了。
  • 在你的 @Equals 方法中;当您 setVersion of object 时,对象没有根据您的 equals 方法更改。是否可以更改equals方法的逻辑取决于您的业务逻辑而不是当前使用的。

标签: java spring-data-jpa


【解决方案1】:

您无法更新实体的 ID,因为此 ID 用于在关系数据库中创建主键。然后会用来生成sql更新语句。

假设您有一个现有数据库,其中只有一条 ID = A 的记录。 然后在 java 中你把这个 id 改成 B。JPA 会把它转换成类似 SQL 的

UPDATE record WHERE Id = 'B'

但是没有以'B'作为ID的记录! 事实证明,数据库中根本没有进行任何更新。

在这种情况下,您可能应该使用生成的 id。

【讨论】:

  • 你的解释让我明白了。经过一番研究,我得出了同样的结论。
【解决方案2】:

你能改变RecordId.class中的equals方法吗?

你可以像这样轻松写;

@Override
public boolean equals(Object obj) {
    return super.equals(obj);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2019-09-21
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2021-10-18
    • 2015-05-25
    相关资源
    最近更新 更多