对象引用未保存的瞬态实例 - 在刷新休眠 JPA 之前保存瞬态实例 [重复]

Posted

技术标签:

【中文标题】对象引用未保存的瞬态实例 - 在刷新休眠 JPA 之前保存瞬态实例 [重复]【英文标题】:Object references an unsaved transient instance - save the transient instance before flushing hibernate JPA [duplicate] 【发布时间】:2020-01-11 08:08:40 【问题描述】:

当我尝试保存数据时显示此错误:

com.LTR.entity.Silicon.platform -> com.LTR.entity.Platform,

它说我需要保存瞬态。

我一直在尝试放置 cascadeType.ALL 但这不起作用。

@Entity
@Table(name="silicon",uniqueConstraints=@UniqueConstraint(columnNames = "silicon_visual_id"))
@EnableTransactionManagement
@DynamicUpdate
public class Silicon implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id", unique = true, nullable = false)
    private Long id;

    @Column(name="mir", unique = false, nullable = true)
    private Long mir;

    @Column(name = "silicon_name", nullable = false, length= 45)
    private String siliconName;

    @Column(name = "type_silicon", nullable = false, length= 45)
    private String typeSilicon;

    @Column(name = "qdf", nullable = true, length= 45)
    private String qdf;

    @Column(name = "silicon_visual_id", nullable = false, length= 45)
    private String siliconVisualId;

    @Column(name = "cpu_id", nullable = true, length= 45)
    private String cpuId;

    @Column(name = "stepping", nullable = true, length= 45)
    private String stepping;

    @Column(name = "socket", nullable = true, length= 45)
    private String socket;

    @Column(name = "status_silicon", nullable = false,length= 45)
    private String statusSilicon;

    @JsonIgnore
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="user_owner", nullable = false)
    private User userOwner;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "date_admission", nullable = false)
    private Date dateAdmission;

    @JsonIgnore
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="user_request", nullable = true)
    private User userRequest;

    @JsonIgnore
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="user_last_returned", nullable = true)
    private User userLastReturned;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "date_delivered", nullable = true)
    private Date dateDelivered;

    @JsonIgnore
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="platform_current", nullable = true)
    private Platform platform;

    @JsonIgnore
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="platform_own", nullable = true,updatable= false)
    private Platform platformOwn;

    /*GETTERS AND SETTERS*/

@Entity
@Table(name="platform")
public class Platform implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="platform_id", unique = true, nullable = false)
    private Long platformId;

    @JsonIgnore
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="locationId", nullable = false)
    private Location location;

    @Enumerated(EnumType.STRING)
    @JoinColumn(name="businessUnit", nullable = true)
    private BusinessUnit businessUnit;

    @Column(name = "name", nullable = false, length= 45,unique = true)
    private String name;

    @Column(name = "project", nullable = false, length= 45)
    private String project;

    @Column(name = "serialPlatform", nullable = false, length= 45, unique 
        = true)
    private String serialPlatform;

    @Column(name = "model", nullable = false, length= 45)
    private String model;

    @Column(name = "chasisSerial", nullable = false, length= 45)
    private String chasisSerial;

    @Column(name = "chasisModel", nullable = false, length= 45)
    private String chasisModel;

    @Column(name = "ismpKitName", nullable = false, length= 45)
    private String ismpKitName;

    @Column(name = "ismpSerialNumber", nullable = false, length= 45)
    private String ismpSerialNumber;

    @Column(name = "assignedTo", nullable = false, length= 45)
    private String assignedTo;

    @Column(name = "OwnedBy", nullable = false, length= 45)
    private String OwnedBy;

    @Column(name = "ismNumber", nullable = false, length= 45)
    private int ismNumber;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "receivedDate", nullable = false)
    private Date receivedDate;

    @Column(name = "asset", nullable = false, length= 45)
    private int asset;

    @Column(name = "startStatus", nullable = false, length= 45)
    private boolean startStatus;

    @Column(name = "finalStatus", nullable = false, length= 45)
    private boolean finalStatus;

    @Column(name = "cloudReady", nullable = false, length= 45)
    private boolean cloudReady;

    @OneToMany(mappedBy="platform")
    private List<Annotation> annotations;

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL, mappedBy 
        = "platform")
    private Set<Silicon> userRole = new HashSet<Silicon>();

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "platform")
    private Host Host;

    /*GETTERS AND SETTERS*/

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.LTR.entity.Silicon.platform -> com.LTR.entity.Platform; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.LTR.entity.Silicon.platform -> com.LTR.entity.Platform
2019-09-09 08:32:43.161 ERROR 21968 --- [nio-8081-exec-9] o.h.i.ExceptionMapperStandardImpl        : HHH000346: Error during managed flush [org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.LTR.entity.Silicon.platform -> com.LTR.entity.Platform]
2019-09-09 08:32:43.172  INFO 21968 --- [nio-8081-exec-9] com.LTR.controller.SiliconController     : org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.LTR.entity.Silicon.platform -> com.LTR.entity.Platform; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.LTR.entity.Silicon.platform -> com.LTR.entity.Platform
2019-09-09 09:25:45.500  WARN 8000 --- [nio-8081-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1048, SQLState: 23000
2019-09-09 09:25:45.500 ERROR 8000 --- [nio-8081-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'owned_by' cannot be null
2019-09-09 09:25:45.506 ERROR 8000 --- [nio-8081-exec-1] o.h.i.ExceptionMapperStandardImpl        : HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
2019-09-09 09:25:45.517  INFO 8000 --- [nio-8081-exec-1] com.LTR.controller.SiliconController     : org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

我不知道为什么当我尝试更新或插入此内容时会因此错误而崩溃 ,而且只有当我尝试更新时平台对象为空时才会发生这种情况

当我设置 cascadeType.ALL 时,它表明来自平台实体的 ownBy 为空,但在数据库中不为空

【问题讨论】:

你能粘贴导致异常的代码吗? 有异常码 @JustinZuñigaTorres 你想在保存硅时忽略平台吗?正确的?所以你不想坚持,对吧? 【参考方案1】:

您需要在保存 Silicon 之前保存 Platform,因此 Persist 是您在此处需要的 CascadeType。

@JsonIgnore
@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name="platform_current", nullable = true)
private Platform platform;

【讨论】:

是的,现在它显示来自平台空的ownedBy 为空,但在数据库中不为空【参考方案2】:

为所有属性添加 cascade="all" 属性。

如下图

@JsonIgnore
@ManyToOne(fetch=FetchType.EAGER, optional=true, cascade=CascadeType.ALL)
@JoinColumn(name="platform_current", nullable = true)
private Platform platform;

您需要设置optional=true

@Column(nullable=true) 用于指示 DDL 生成工具包含一个 NULL SQL 列类型约束。

有关可选与可为空的更多信息,请查看this *** answer.

【讨论】:

2019-09-09 09:20:15.628 WARN 2004 --- [nio-8081-exec-7] ohengine.jdbc.spi.SqlExceptionHelper:SQL 错误:1048,SQLState:23000 2019 -09-09 09:20:15.632 错误 2004 --- [nio-8081-exec-7] ohengine.jdbc.spi.SqlExceptionHelper:列 'owned_by' 不能为空 我放了 cascadeType.ALL,现在它显示这个错误是的,该列可以为空,但在数据库中不为空

以上是关于对象引用未保存的瞬态实例 - 在刷新休眠 JPA 之前保存瞬态实例 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

对象引用未保存的瞬态实例 在刷新错误之前保存瞬态实例

HIbernate - 对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例

对象引用未保存的瞬态实例:在刷新之前保存瞬态实例[重复]

TransientObjectException - 对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例

TransientPropertyValueException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例

对象引用了一个未保存的瞬态实例 - Spring,JPA Hibernate