Java 如何在Spring JPA中更新嵌入ID的字段
我有一个RecordId类,它是可嵌入的,并且在Record类中作为嵌入ID被引用。RecordId具有版本和日期字段。在记录的更新操作期间,我必须更新记录ID的字段,即版本。我正在使用下面的代码来实现这一点Java 如何在Spring JPA中更新嵌入ID的字段,java,spring-data-jpa,Java,Spring Data Jpa,我有一个RecordId类,它是可嵌入的,并且在Record类中作为嵌入ID被引用。RecordId具有版本和日期字段。在记录的更新操作期间,我必须更新记录ID的字段,即版本。我正在使用下面的代码来实现这一点 existingRecord.getRecordId().setVersion(recordData.getRecordId().getVersion()); recordRepository.save(existingRecord); 但是数据库中的数据没有得到更新 更新Embedde
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());
}
}
记录具有嵌入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;
}
}
JPA repository与Record类的接口
// JPA Repository
public interface RecordRepository extends JpaRepository<Record, RecordId>{
}
//JPA存储库
公共接口RecordRepository扩展了JpaRepository{
}
无法更新实体的ID,因为此ID用于在关系数据库中创建主键。然后将用于生成sql update语句
假设现有数据库中只有一条ID为A的记录。
然后在java中,您将这个id更改为B。JPA将把它转换为类似SQL的代码
UPDATE record WHERE Id = 'B'
但是没有以“B”作为ID的记录!
结果是数据库中根本没有更新
在这种情况下,您可能应该使用生成的id。能否更改RecordId.class中的equals方法 你可以像这样轻松地写作
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
请提供您正在尝试保存的实体和@Embeddeble class。添加了我正在与Embeddeble class一起保存的实体。是否可以尝试将默认构造函数添加到
RecordId.class
-->public RecordId(){}
它已经存在了;当您设置对象的版本时,对象并没有根据equals方法进行更改。您能否更改equals方法的逻辑取决于您的业务逻辑,而不是当前使用的。您的解释帮助我清楚地理解。经过一番研究,我得出了同样的结论。