Как обновить поля EmbeddedID в Spring JPA - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть класс RecordId, который является Embeddable и упоминается в классе 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());
}

}

Класс записи со встроенным идентификатором, который использует указанный выше встраиваемый класс в качестве составного ключа.

@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 с классом Record.

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

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Можно ли изменить метод equals в RecordId.class ;

Вы можете написать легко, как;

@Override
public boolean equals(Object obj) {
    return super.equals(obj);
}
0 голосов
/ 05 сентября 2018

Вы не можете обновить идентификатор своей сущности, поскольку этот идентификатор используется для создания первичного ключа в реляционной базе данных. И затем будет использоваться для создания оператора обновления sql.

Предположим, у вас есть существующая база данных только с одной записью с ID = A. Затем в java вы меняете этот идентификатор на B. JPA преобразует это в некоторый SQL, такой как

UPDATE record WHERE Id = 'B'

Но нет записи с «B» в качестве идентификатора! Оказывается, что обновление в базе данных вообще не производится.

В этом случае вам, вероятно, следует использовать сгенерированный идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...