Это соответствующий класс:
@Entity
@Table(name = "inventory_data_center")
public class InventoryDataCenterEntity {
@Id
@Column(unique = true)
private String name;
@Column(name = "azure_config", columnDefinition = "TEXT")
@Convert(converter = AzureConfigurationToStringConverter.class)
private List<PodCollection> azureDataCenters;
@Column(name = "monitoringprefix")
private String monitoringPrefix;
public String getName () {
return name;
}
public void setName ( String name ) {
this.name = name;
}
@Cascade(CascadeType.ALL)
public List<PodCollection> getAzureDataCenters () {
return azureDataCenters;
}
public void setAzureDataCenters ( List<PodCollection> azureDataCenters ) {
this.azureDataCenters = azureDataCenters;
}
public String getMonitoringPrefix() {
return monitoringPrefix;
}
public void setMonitoringPrefix(String monitoringPrefix) {
this.monitoringPrefix = monitoringPrefix;
}
}
В исключении InventoryRegionEntity упоминается следующее:
@Entity
@Table(name = "inventory_region")
public class InventoryRegionEntity{
@Id
@Column(unique = true)
@Enumerated(EnumType.STRING)
@NotNull
private Region region;
@ManyToOne
@NotNull
private InventoryDataCenterEntity primaryDC;
@ManyToOne
@JoinColumn(name = "secondarydc_name")
private InventoryDataCenterEntity secondaryDC;
private boolean anycast;
public boolean isAnycast () {
return anycast;
}
public void setAnycast ( boolean anycast ) {
this.anycast = anycast;
}
public Region getRegion () {
return this.region;
}
public void setRegion ( Region region ) {
this.region = region;
}
public InventoryDataCenterEntity getPrimaryDC () {
return primaryDC;
}
public void setPrimaryDC ( InventoryDataCenterEntity primaryDC ) {
this.primaryDC = primaryDC;
}
public InventoryDataCenterEntity getSecondaryDC () {
return secondaryDC;
}
public void setSecondaryDC ( InventoryDataCenterEntity secondaryDC ) {
this.secondaryDC = secondaryDC;
}
}
И я получаю исключение:
{
"severity": "HIGH",
"message": "org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.gms.model.inventory.InventoryRegionEntity.secondaryDC -> com.gms.model.inventory.InventoryDataCenterEntity; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.gms.model.inventory.InventoryRegionEntity.secondaryDC -> com.gms.model.inventory.InventoryDataCenterEntity",
"requestURI": "/global-management-system/v1/region-inventory",
"type": "org.springframework.dao.InvalidDataAccessApiUsageException",
"stackTrace": null
}
Я читал в других сообщениях, что я должен добавить @ Каскад (CascadeType.ALL) перед членом или перед методом получения коллекции (как в примере выше). Я также пробовал CascadeType.PERSIST и CascadeType.SAVE_UPDATE, но получил тот же результат.
Пожалуйста, порекомендуйте.
Спасибо
@ JigneshM.Khatri добавил
И вы получаете это исключение, когда пытаетесь сохранить InventoryRegionEntity
?
@ JigneshM.Khatri права
Вам нужно добавить @Cascade(CascadeType.ALL)
на private InventoryDataCenterEntity secondaryDC;
в InventoryRegionEntity
.
@ JigneshM.Khatri В дополнение к тому, что у меня уже есть? И только для вторичного постоянного тока? А как насчет primaryDC?
Да в дополнение к тому, что у вас уже есть. Вы не сопоставили primaryDC ни с одним из столбцов. На нем не упоминается @JoinColumn. Таким образом, нет необходимости добавлять каскадный тип на primaryDC.
Позвольте нам продолжить обсуждение в чате.
Исключение говорит о том, что InventoryDataCenterEntity
в InventoryRegionEntity
не найден в базе данных, а также вы не сохраняете его в базе данных. Так что эту ценность можно потерять. Таким образом, добавление cascadeType.ALL
сохранит InventoryDataCenterEntity
вместе с InventoryRegionEntity
, если он еще не сохранен в базе данных.
Большое спасибо за уделенное время!
Пожалуйста :)
Можете показать код модели
InventoryRegionEntity
?