为什么会出现hibernate.TransientPropertyValueException?

时间:2018-10-25 13:43:27

标签: spring hibernate

这是相关的课程:

@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
}

我读过其他文章,我应该在成员之前或在集合get方法之前添加 @Cascade(CascadeType.ALL)(如上例所示)。 我也尝试了CascadeType.PERSIST和CascadeType.SAVE_UPDATE,但是得到了相同的结果。

请告知。

谢谢

1 个答案:

答案 0 :(得分:0)

该异常表明InventoryDataCenterEntity中的InventoryRegionEntity在数据库中找不到,并且您也没有将其保存在数据库中。这样就可能失去价值。因此,添加cascadeType.ALL将保存InventoryDataCenterEntityInventoryRegionEntity(如果尚未保存在数据库中)。